目录
1.外观模式定义
2.优点
3.缺点
5.示例
6.工作流程
7.应用场景
8.本质
9.涉及的设计原则
10.与其他设计模式的关系
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
简化接口:外观模式提供了一个简化的接口,隐藏了系统复杂性,使客户端更容易使用。
解耦客户端和子系统:外观模式将客户端与子系统解耦,客户端不需要了解子系统的实现细节。
提高可维护性:外观模式将系统的组件隔离,改变系统时只需要修改外观而不影响客户端。
遵循单一职责原则:每个子系统负责自己的功能,符合单一职责原则。
可能导致外观对象过于臃肿:如果系统变得非常复杂,外观对象可能会变得庞大,难以维护。
限制灵活性:外观模式隐藏了子系统的复杂性,但也可能限制了客户端对子系统的灵活访问。
外观(Facade):外观是客户端与子系统之间的接口,它提供了一个简化的接口,封装了对子系统的调用,客户端通过外观来访问系统。
子系统(Subsystems):子系统是一组相关的类或接口,它们实现了系统的具体功能,但对客户端来说可能过于复杂。外观通过与子系统交互来完成客户端的请求。
创建一个Facade类,提供一个统一的接口,用来访问子系统中的一群接口:
/*
结构型-外观(门面)模式:提供一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用。
*/
public class Facade {
private SubSystem subSystem = new SubSystem();
public void watchTV(){
subSystem.turnOnTV();
subSystem.changeChannel();
subSystem.turnOffTV();
}
}
创建子系统:
public class SubSystem {
public void turnOnTV(){
System.out.println("打开电视");
};
public void turnOffTV(){
System.out.println("关闭电视");
};
public void changeChannel(){
System.out.println("转换频道");
};
}
客户端代码:?
public class FacadeClient {
// 普通实现:客户端需要与子系统内部多个模块交互,强耦合
public static void main(String[] args) {
SubSystem subSystem = new SubSystem();
subSystem.turnOnTV();
subSystem.changeChannel();
subSystem.turnOffTV();
// 外观模式下,只需要直接使用门面对象
new Facade().watchTV();
}
}
客户端通过外观接口与外观对象交互。
外观对象将请求转发给相应的子系统。
子系统执行请求并将结果返回给外观对象。
外观对象将结果返回给客户端,客户端无需了解子系统的详细实现。
外观模式适用于以下情况:
当系统拥有复杂的子系统结构,而客户端只需与系统的部分功能交互时,可以使用外观模式。
当希望封装系统的复杂性,提供一个简单的接口给客户端时,可以使用外观模式。
当需要解耦客户端和子系统之间的依赖关系时,可以使用外观模式。
外观模式的本质是为系统提供一个高层次的接口,以封装和简化复杂的子系统。
单一职责原则(Single Responsibility Principle):外观模式有助于确保每个子系统负责自己的功能,符合单一职责原则。
封装原则(Encapsulation Principle):外观模式通过封装子系统的复杂性,提供了一个简化的接口。
框架示例:
一个示例是在图形用户界面(GUI)开发中使用外观模式。GUI库可以提供一个外观对象,使开发者能够更容易地创建窗口、按钮、文本框等界面元素,而无需了解每个元素的复杂构建和交互细节。这种方式简化了GUI开发,隐藏了底层窗口系统的复杂性。