设计模式

守給你的承諾、 提交于 2020-04-14 07:23:51

【今日推荐】:为什么一到面试就懵逼!>>>

基本介绍

外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,它为子系统中的一组接口提供一个统一的高层接口,使子系统更容易被使用

外观模式又称为门面模式,它是一种对象结构型模式。

模式结构

1、Client(客户端):调用者

2、Facade(外观类):即上述所讲的高层接口

3、SubSystem(子系统):被调用者

举例说明

想要使用电脑,你只需要按一下开机键(客户端),电脑的各个部件(子系统)就开始工作了,你不需要关心硬盘如何启动的,CPU怎么运转的等等,一切都交给内部程序(外观类)处理。

编写简单的程序模拟一下

「SubSystem」:电脑的几个部件 CPU、内存、硬盘

public class Cpu {
    //使用「单例模式--饿汉式」创建对象
    private static Cpu instance = new Cpu();

    private Cpu() {
    }

    public static Cpu getInstance() {
        return instance;
    }

    public void start() {
        System.out.println("CPU启动");
    }

    public void stop() {
        System.out.println("CPU停止工作");
    }
}
public class Memory {
    private static Memory instance = new Memory();

    private Memory() {
    }

    public static Memory getInstance() {
        return instance;
    }

    public void start() {
        System.out.println("内存启动");
    }

    public void stop() {
        System.out.println("内存停止工作");
    }
}
public class HardDisk {
    private static HardDisk instance = new HardDisk();

    private HardDisk() {
    }

    public static HardDisk getInstance() {
        return instance;
    }

    public void start() {
        System.out.println("硬盘启动");
    }

    public void stop() {
        System.out.println("硬盘停止工作");
    }
}

「Facade」:电脑,统一管理开机关机中硬件的启动与停止

public class Computer {
    private Cpu cpu;
    private Memory memory;
    private HardDisk hardDisk;

    public Computer() {
        this.cpu = Cpu.getInstance();
        this.memory = Memory.getInstance();
        this.hardDisk = HardDisk.getInstance();
    }

    /**
     * 开机
     */
    public void boot(){
        cpu.start();
        memory.start();
        hardDisk.start();
    }

    /**
     * 关机
     */
    public void shutdown(){
        cpu.stop();
        memory.stop();
        hardDisk.stop();
    }
}

「Client」:电源键,可控制开机、关机

public class Client {
    Computer computer = new Computer();

    @Test
    public void boot(){
        computer.boot();
    }

    @Test
    public void shutdown(){
        computer.shutdown();
    }
}

模式分析

优点:

  • 实现了客户端与子系统的低耦合,使得子系统的变化不会影响客户端,只需要调整外观类即可。
  • 对客户端屏蔽子系统,减少了客户端处理的对象数目,操作变得更简单。
  • 降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。

缺点:

  • 不能很好的限制客户端对子系统的使用,如果对其做了太多限制会降低可变性和灵活性。
  • 在不引入「抽象外观类」的情况下,如果增加新的子系统,需要修改外观类代码,违背了「开闭原则」

适用场景

  • 当要为一个复杂子系统提供一个简单接口时可以使用外观模式。该接口可以满足大多数用户的需求,而且用户也可以越过外观类直接访问子系统。
  • 客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。
  • 在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。

p.s. 所有代码和笔记均可在 我的GitHub 中获取,如果对您有帮助的话,可以点个 star 支持一下 🙈

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!