聊聊设计模式——外观模式
目录
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):外观模式通过封装子系统的复杂性,提供了一个简化的接口。
相关设计模式:
- 适配器模式(Adapter Pattern):适配器模式用于将一个接口转换为另一个接口,而外观模式用于简化接口,使其更易于使用。
- 单例模式(Singleton Pattern):外观模式中的外观对象通常是单例的,以确保系统中只有一个外观对象。
- 抽象工厂模式(Abstract Factory Pattern):外观模式可以与抽象工厂模式一起使用,以提供一个更高级别的接口来创建一组相关对象。
框架示例:
一个示例是在图形用户界面(GUI)开发中使用外观模式。GUI库可以提供一个外观对象,使开发者能够更容易地创建窗口、按钮、文本框等界面元素,而无需了解每个元素的复杂构建和交互细节。这种方式简化了GUI开发,隐藏了底层窗口系统的复杂性。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!