外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
外观(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。
创建Computer
接口类,定义start
方法
public interface Computer {
void start();
}
实现Computer
接口,CPU开始工作
public class Cpu implements Computer {
@Override
public void start() {
System.out.println("start cpu.");
}
}
实现Computer
接口,Memory开始工作
public class Memory implements Computer {
@Override
public void start() {
System.out.println("start memory.");
}
}
实现Computer
接口,Disk开始工作
public class Disk implements Computer {
@Override
public void start() {
System.out.println("start disk.");
}
}
创建外观类,封装计算机启动需要的设备,用于对外展现
public class FacadeDemo {
private Cpu cpu;
private Memory memory;
private Disk disk;
public FacadeDemo() {
cpu = new Cpu();
memory = new Memory();
disk = new Disk();
}
public void startCpu() {
cpu.start();
}
public void startMemory() {
memory.start();
}
public void startDisk() {
disk.start();
}
}
测试外观模式的实现过程
public class Test {
public static void main(String[] args) {
FacadeDemo demo = new FacadeDemo();
demo.startCpu();
demo.startMemory();
demo.startDisk();
}
}
测试输出内容
start cpu.
start memory.
start disk.
优缺点
1、减少系统相互依赖。
2、提高灵活性。
3、提高了安全性。
4、不能很好地限制客户使用子系统类。
5、增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
模式结构
1、外观(Facade)角色:为多个子系统对外提供一个共同的接口。
2、子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
3、客户(Client)角色:通过一个外观角色访问各个子系统的功能。
参考文章
1、http://c.biancheng.net/view/1369.html
2、https://www.runoob.com/design-pattern/facade-pattern.html
本文由 新逸Cary 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://blog.xinac.cn/archives/java-design-facade.html
最后更新:2020-08-28 11:38:21
Update your browser to view this website correctly. Update my browser now