设计模式之外观(Facade)

2018-08-02  本文已影响73人  ikonan

概述

外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。

场景及角色的介绍

使用场景

简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。

使用场景

类图

外观模式(Facade)结构图

实例

下面,我们就通过一个简单的例子来实现该模式。每个Computer都有CPU、Memory、Disk。在Computer开启和关闭的时候,相应的部件也会开启和关闭,所以,使用了该外观模式后,会使用户和部件之间解耦

cpu子系统类

/**
 * cpu子系统类
 * @author Administrator
 *
 */
public class CPU {
    public static final Logger LOGGER = Logger.getLogger(CPU.class);
    public void start() {
        LOGGER.info("cpu is start...");
    }
    
    public void shutDown() {
        LOGGER.info("CPU is shutDown...");
    }
}

Disk子系统类

/**
 * Disk子系统类
 * @author Administrator
 *
 */
public class Disk{
    public static final Logger LOGGER = Logger.getLogger(Disk.class);
    public void start() {
        LOGGER.info("Disk is start...");
    }
    
    public void shutDown() {
        LOGGER.info("Disk is shutDown...");
    }
}

Memory子系统类

/**
 * Memory子系统类
 * @author Administrator
 *
 */
public class Memory {
    public static final Logger LOGGER = Logger.getLogger(Memory.class);
    public void start() {
        LOGGER.info("Memory is start...");
    }
    
    public void shutDown() {
        LOGGER.info("Memory is shutDown...");
    }
}

然后是,门面类Facade

/**
 * 门面类(核心)
 * @author Administrator
 *
 */
public class Computer {
    public static final Logger LOGGER = Logger.getLogger(Computer.class);
    
    private CPU cpu;
    private Memory memory;
    private Disk disk;
    public Computer() {
        cpu = new CPU();
        memory = new Memory();
        disk = new Disk();
    }

    public void start() {
        LOGGER.info("Computer start begin");
        cpu.start();
        disk.start();
        memory.start();
        LOGGER.info("Computer start end");
    }
    
    public void shutDown() {
        LOGGER.info("Computer shutDown begin");
        cpu.shutDown();
        disk.shutDown();
        memory.shutDown();
        LOGGER.info("Computer shutDown end...");
    }
}

最后为,客户角色

/**
 * 客户端类
 * @author Administrator
 *
 */
public class Cilent {
    public static final Logger LOGGER = Logger.getLogger(Cilent.class);
    public static void main(String[] args) {
        Computer computer = new Computer();
        computer.start();
        LOGGER.info("=================");
        computer.shutDown();
    }
}

运行结果
Computer start begin
cpu is start...
Disk is start...
Memory is start...
Computer start end
=================
Computer shutDown begin
CPU is shutDown...
Disk is shutDown...
Memory is shutDown...
Computer shutDown end...

总结

外观模式的目的不是给予子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散耦合,从而让外部能够更简单地使用子系统。

外观模式的本质是:封装交互,简化调用。

上一篇下一篇

猜你喜欢

热点阅读