1、外观模式/门面模式(Facade)的定义
外观模式是隐藏了系统的复杂性,能够为子系统中的一组接口提供一个统一的接口。客户在使用系统时不必和子系统打交道了,降低了客户和子系统间的耦合。
2、模式(Facade)优缺点
外观模式是一种结构型模式,其主要优缺点如下。
优点:
- 减少客户端关联的类。使客户端关联子系统的类减少,使用子系统更加容易。
- 实现客户端和子系统的松耦合。子系统相互独立,变化不会影响到其他子系统和客户端,只需要调整外观类。
- 一个子系统的变化不会影响到另一个子系统,子系统内部变化也不会影响到外观对象。
缺点:
- 限制客户端访问困难。如果过多限制客户端访问子系统,则会极大减少可变性和灵活性。
- 可能修改源码。设计不当,增加子系统会修改外观类源码,违背开闭原则。
3、模式(Facade)适用环境
- 为访问一系列复杂子系统提供简单的入口。
- 客户端和子系统之间存在很大依赖。
- 层次化结构中使用外观模式定义每一层的入口,层与层不直接产生联系,降低耦合度。
4、模式(Facade)的结构
外观模式(门面模式)所涉及到的角色有:
- 门面角色/外观角色(facade) :这是外观模式的核心。它被客户角色调用,因此它熟悉子系统的功能。它内部根据客户角色已有的需求预定了几种功能组合。
- 子系统角色(SubSystem(SystemA、SystemB、SystemC)) :在软件系统中可以有一个或多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用。对于子系统而言,外观类只是另一个客户,它没有任何facade角色的信息和链接。
- 客户角色(client) :调用facade角色来完成要得到的功能。
5、模式(Facade)的应用实例
SubSystem 子系统角色
public class CPU {
public void startup(){
System.out.println("cpu startup!");
}
public void shutdown(){
System.out.println("cpu shutdown!");
}
}
public class Memory {
public void startup(){
System.out.println("memory startup!");
}
public void shutdown(){
System.out.println("memory shutdown!");
}
}
public class Disk {
public void startup(){
System.out.println("disk startup!");
}
public void shutdown(){
System.out.println("disk shutdown!");
}
}
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!");
}
}
客户端角色
Computer computer = new Computer();
computer.startup();
computer.shutdown();
6、模式(Facade)的延伸
在上面的例子中,我们定义的门面是一个具体的类,但是当需要增加新的功能的时候,就需要修改门面类了,所以最好的办法是做成抽象门面,也就是将门面类的功能抽象出来,然后有不同的需求的时候,可以做两个具体的门面类。
评论区