设计模式之外观模式

简介:《设计模式》对外观模式的定义:为子系统中的一组接口提供一个统一接口,外观模式定义了一个更高层的接口,使子系统更加容易使用。也就是说:外观模式隐藏了系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。

外观模式结构图:

设计模式之外观模式

角色:

       1:门面角色(Facade):外观模式的核心,被客户角色所调用,它熟悉子系统的功能

        2:子系统角色:实现了子系统的功能,它对客户角色和Facade角色是未知的。

        3:客户角色(Client):通过调用Facade来完成要实现的功能

代码实操:

          假设一台电脑,它包含了 CPU(处理器),Memory(内存) ,Disk(硬盘)这几个部件,若想要启动电脑,则先后必须启动 CPU、Memory、Disk。关闭也是如此。但是实际上我们在电脑开/关机时根本不需要去操作这些组件,因为电脑已经帮我们都处理好了,并隐藏了这些东西。

设计模式之外观模式

CPU类(子系统中的):

public class CPU {

    public void startup(){
        System.out.println("cpu startup");
    }
    public void shutdown(){
        System.out.println("cpu shutdown");
    }
}

Memory 类(子系统中的):

public class Memory {
    public void startup(){
        System.out.println("Memory startup");
    }
    public void shutdown(){
        System.out.println("Memory shutdown");
    }
}

Disk 类(子系统中的):

public class Disk {
    public void startup(){
        System.out.println("Disk startup");
    }
    public void shutdown(){
        System.out.println("Disk shutdown");
    }
}

Computer 类(即Facade类):

public class Computer {

    private CPU cpu;
    private Memory memory;
    private Disk disk;

    public Computer(){
        cpu = new CPU();
        memory = new Memory();
        disk = new Disk();
    }
    
    public void startup(){
        System.out.println("start the computer");
        cpu.startup();
        memory.startup();
        disk.startup();
        System.out.println("start computer finished");
    }
    
    public void shutdown(){
        System.out.println("begin to close the computer");
        cpu.shutdown();
        memory.shutdown();
        disk.shutdown();
        System.out.println("computer closed");
    }
}

User类(Client类):

public class User {
    public static void main(String[] args) {

        Computer computer = new Computer();
        computer.startup();
        computer.shutdown();
    }

}

运行结果:

设计模式之外观模式

 

从这个例子来看,Client并不需要知道子系统内部的具体实现,只需要和Facade进行交互就可以了;如果没有Facade的话,客户端需要以此与子系统中的三个类进行交互。

优点:

    1:外观模式对客户端屏蔽了子系统组件,从而简化了接口,减少了客户端处理的对象数目并使子系统的使用 更加简单。

    2:外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使子系统的组件变化不会影响 到它的客户端。

缺点:

  增加新的子系统可能需要修改外观类或客户端,违背了“开闭原则”

应用场景:

    • 不需要使用一个复杂系统的所有功能,而且可以创建一个新的类,包含访系统的所有规则。如果只需使用系统的部分功能(这是通常的情况),那么你为新类所创建的API将比原系统的API简单的多
    • 希望封装或隐藏原系统
    • 希望使用原系统的功能,而且还希望增加一些新的功能
    • 编写新类的成本小于所有人学会使用或者未来维护原系统上所需的成本