【设计模式】我终于读懂了外观模式。。。

简介: 【设计模式】我终于读懂了外观模式。。。

🎿影院管理项目


组建一个家庭影院:


DVD 播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能,

其过程为: 直接用遥控器:统筹各设备开关

开爆米花机,

放下屏幕,

开投影仪,

开音响,

开 DVD 观影结束后,

关闭各种设备


👾传统方式解决影院管理



11be89cde4f844eb880c02bba842acf7.png


♠️ 传统方式解决影院管理问题分析



1)在 ClientTest 的 main 方法中,创建各个子系统的对象,并直接去调用子系统(对象)相关方法,会造成调用过程混乱,没有清晰的过程

2)不利于在 ClientTest 中,去维护对子系统的操作

3)解决思路:定义一个高层接口,给子系统中的一组接口提供一个一致的界面(比如在高层接口提供四个方法ready, play, pause, end ),用来访问子系统中的一群接口

4)也就是说 就是通过定义一个一致的接口(界面类),用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节 => 外观模式


💎外观模式


1)外观模式(Facade),也叫过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

2)外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节


♥️外观模式原理类图



3a074d7159a947148993849ed90a186f.png



♣️对类图说明(分类外观模式的角色)


1)外观类(Facade): 为调用端提供统一的调用接口, 外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象

2)调用者(Client): 外观接口的调用者

3)子系统的集合:指模块或者子系统,处理 Facade 对象指派的任务,他是功能的实际提供者


💍外观模式解决影院管理


1)外观模式可以理解为转换一群接口,客户只要调用一个接口,而不用调用多个接口才能达到目的。

比如:在 pc 上安装软件的时候经常有一键安装选项(省去选择安装目录、安装的组件等等),还有就是手机的重启功能(把关机和启动合为一个操作)。


2)外观模式就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用


3)示意图说明


b687d29b562a47a7b9283ceb9b74f69e.png



♦️外观模式应用实例

🎼思路分析和图解(类图)


d0b268ae25ce45d9adbcfe7b9e408b2b.png


这里做了删减,只保留三个类就行了,没必要搞那么多

DVDPlayer类

2243c31bb8664bbfb34c853c2f78b843.png

Stereo类


ad17b9e3c10b44b8afd082ee6482959a.png

TheaterLight类



9a8992f5eb864614aeda62c2e1d05709.png

最后再用一个外观类去包装他们

HomeTheaterFacade类

54ac2ea6c7d743ab93868d2bd1ac7127.png

然后在Client类里面执行就行了


a41fb1d0aa084b9489c9443024e2ef32.png

🎹外观模式在 MyBatis 框架应用的源码分析

🎻1)MyBatis 中的 Configuration 去创建 MetaObject 对象使用到外观模式

🎮2)代码分析+Debug 源码+示意图


628e811a31f44d7690a0b33e532d8d0d.png

1aeb7f0886424fc3924bd4e8fda87b87.png

ef130a27b8184ce597ec3fe9abd54637.png


4bb25d3a0a4d48e5b79e8923cfea4627.png


🃏3)对源码中使用到的外观模式的角色类图


1a821a429a504dc1b745384379ecaf53.png



🎴外观模式的注意事项和细节


1)外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性

2)外观模式对客户端与子系统的耦合关系 - 解耦,让子系统内部的模块更易维护和扩展

3)通过合理的使用外观模式,可以帮我们更好的划分访问的层次

4)当系统需要进行分层设计时,可以考虑使用 Facade 模式

5)在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个 Facade 类,来提供遗留系统的比较清晰简单的接口,让新系统与 Facade 类交互,提高复用性

6)不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好。要以让系统有层次,利于维护为目的。

说白了,就是就是加了一层类,相信大家自己在写代码的时候无意都写得出,这个模式很简单,没有什么难度,就是套了一层壳,过吧过吧。。。


资料参考:https://www.bilibili.com/video/BV1G4411c7N4


代码地址:https://gitee.com/WangFuGui-Ma/design-pattern/tree/master/design

相关文章
|
7月前
|
设计模式 API 数据安全/隐私保护
探索设计模式的魅力:外观模式简化术-隐藏复杂性,提供简洁接口的设计秘密
外观模式是一种关键的设计模式,旨在通过提供一个简洁的接口来简化复杂子系统的访问。其核心价值在于将复杂的内部实现细节封装起来,仅通过一个统一的外观对象与客户端交互,从而降低了系统的使用难度和耦合度。在软件开发中,外观模式的重要性不言而喻。它不仅能够提高代码的可读性、可维护性和可扩展性,还能促进团队间的协作和沟通。此外,随着业务需求和技术的发展,外观模式能够适应变化,通过修改外观对象来灵活调整客户端与子系统之间的交互方式。总之,外观模式在软件设计中扮演着举足轻重的角色,是构建高效、稳定且易于维护的软件系统的关键
195 1
探索设计模式的魅力:外观模式简化术-隐藏复杂性,提供简洁接口的设计秘密
|
7月前
|
设计模式 Java
23种设计模式,外观模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】外观模式(Facade Pattern)是一种使用频率非常高的结构型设计模式,其核心思想是为子系统中的一组接口提供一个一致的界面。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。简而言之,外观模式就是客户端与复杂子系统之间的一个简单而统一的接口
85 3
|
7月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
75 1
|
3月前
|
设计模式 Java
Java设计模式-外观模式(11)
Java设计模式-外观模式(11)
|
2月前
|
设计模式 Java
Java设计模式之外观模式
这篇文章详细解释了Java设计模式之外观模式的原理及其应用场景,并通过具体代码示例展示了如何通过外观模式简化子系统的使用。
34 0
|
4月前
|
设计模式 存储 Java
【九】设计模式~~~结构型模式~~~外观模式(Java)
文章详细介绍了外观模式(Facade Pattern),这是一种对象结构型模式,通过引入一个外观类来简化客户端与多个子系统之间的交互,降低系统的耦合度,并提供一个统一的高层接口来使用子系统。通过文件加密模块的实例,展示了外观模式的动机、定义、结构、优点、缺点以及适用场景,并讨论了如何通过引入抽象外观类来提高系统的可扩展性。
【九】设计模式~~~结构型模式~~~外观模式(Java)
|
5月前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 外观模式
js设计模式【详解】—— 外观模式
44 2
|
7月前
|
设计模式
设计模式-外观模式
设计模式-外观模式
59 0
|
6月前
|
设计模式 Java
Java设计模式:外观模式之优雅门面(九)
Java设计模式:外观模式之优雅门面(九)
|
6月前
|
设计模式 Java
Java设计模式之外观模式详解
Java设计模式之外观模式详解