外观设计模式解读

简介: 外观设计模式解读

80680a4669ea49d7a698ea6a0178e5f3.png

s统的内部细节 => 外观模式

外观模式基本介绍

概念

1) 外观模式(Facade),也叫“过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
2) 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节

外观模式原理类图

分类外观模式的角色

1) 外观类(Facade): 为调用端提供统一的调用接口, 外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象
2) 调用者(Client): 外观接口的调用者
3) 子系统的集合:指模块或者子系统,处理 Facade 对象指派的任务,他是功能的实际提供者

外观模式解决影院管理

传统方式解决影院管理说明

1) 外观模式可以理解为转换一群接口,客户只要调用一个接口,而不用调用多个接口才能达到目的。比如:在 pc上安装软件的时候经常有一键安装选项(省去选择安装目录、安装的组件等等),还有就是手机的重启功能(把关机和启动合为一个操作)。
2) 外观模式就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用

外观模式应用实例

1) 应用实例要求
2) 使用外观模式来完成家庭影院项目
3) 思路分析和图解(类图)

DVDPlayer

1. public class DVDPlayer {
2. 
3. //使用单例模式, 使用饿汉式
4. private static DVDPlayer instance = new DVDPlayer();
5. 
6. public static DVDPlayer getInstanc() {
7. return instance;
8.     }
9. 
10. public void on() {
11.         System.out.println(" dvd on ");
12.     }
13. 
14. public void off() {
15.         System.out.println(" dvd off ");
16.     }
17. 
18. public void play() {
19.         System.out.println(" dvd is playing ");
20.     }
21. 
22. public void pause() {
23.         System.out.println(" dvd pause ..");
24.     }
25. }

Popcorn

1. public class Popcorn {
2. private static Popcorn instance = new Popcorn();
3. public static Popcorn getInstance() {
4. return instance;
5.     }
6. public void on() {
7.         System.out.println(" popcorn on ");
8.     }
9. public void off() {
10.         System.out.println(" popcorn ff ");
11.     }
12. public void pop() {
13.         System.out.println(" popcorn is poping ");
14.     }
15. 
16. }

Projector

1. public class Projector {
2. private static Projector instance = new Projector();
3. public static Projector getInstance() {
4. return instance;
5.     }
6. public void on() {
7.         System.out.println(" Projector on ");
8.     }
9. public void off() {
10.         System.out.println(" Projector ff ");
11.     }
12. public void focus() {
13.         System.out.println(" Projector is Projector ");
14.     }
15. 
16. }

Stereo

1. public class Stereo {
2. private static Stereo instance = new Stereo();
3. public static Stereo getInstance() {
4. return instance;
5.     }
6. public void on() {
7.         System.out.println(" Stereo on ");
8.     }
9. public void off() {
10.         System.out.println(" Screen off ");
11.     }
12. public void up(){
13.         System.out.println(" Screen up.. ");
14.     }
15. }

TheaterLight

1. public class TheaterLight {
2. private static TheaterLight instance = new TheaterLight();
3. public static TheaterLight getInstance() {
4. return instance;
5.     }
6. public void on() {
7.         System.out.println(" TheaterLight on ");
8.     }
9. public void off() {
10.         System.out.println(" TheaterLight off ");
11.     }
12. public void dim() {
13.         System.out.println(" TheaterLight dim.. ");
14.     }
15. public void bright() {
16.         System.out.println(" TheaterLight bright.. ");
17.     }
18. 
19. }

Screen

1. public class Screen {
2. private static Screen instance = new Screen();
3. public static Screen getInstance() {
4. return instance;
5.     }
6. public void up() {
7.         System.out.println(" Screen up ");
8.     }
9. public void down() {
10.         System.out.println(" Screen down ");
11.     }
12. }

HomeTheaterFacade

1. public class HomeTheaterFacade {
2. //定义各个子系统对象
3. private TheaterLight theaterLight;
4. private Popcorn popcorn;
5. private Stereo stereo;
6. private Projector projector;
7. private Screen screen;
8. private DVDPlayer dVDPlayer;
9. //构造器
10. public HomeTheaterFacade() {
11. super();
12. this.theaterLight = TheaterLight.getInstance();
13. this.popcorn = Popcorn.getInstance();
14. this.stereo = Stereo.getInstance();
15. this.projector = Projector.getInstance();
16. this.screen = Screen.getInstance();
17. this.dVDPlayer = DVDPlayer.getInstanc();
18.     }
19. //操作分成 4 步
20. public void ready() {
21.         popcorn.on();
22.         popcorn.pop();
23.         screen.down();
24.         projector.on();
25.         stereo.on();
26.         dVDPlayer.on();
27.         theaterLight.dim();
28.     }
29. public void play() {
30.         dVDPlayer.play();
31.     }
32. public void pause() {
33.         dVDPlayer.pause();
34.     }
35. public void end() {
36.         popcorn.off();
37.         theaterLight.bright();
38.         screen.up();
39.         projector.off();
40.         stereo.off();
41.         dVDPlayer.off();
42.     }
43. }

Client

1. public class Client {
2. public static void main(String[] args) {
3. 
4. HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();
5.         homeTheaterFacade.ready();
6.         homeTheaterFacade.play();
7.         homeTheaterFacade.end();
8.     }
9. }

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

1) 外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性
2) 外观模式对客户端与子系统的耦合关系 - 解耦,让子系统内部的模块更易维护和扩展
3) 通过合理的使用外观模式,可以帮我们更好的划分访问的层次
4) 当系统需要进行分层设计时,可以考虑使用 Facade 模式
5) 在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facade 类,来提供遗留系统的比较清晰简单的接口,让新系统与 Facade 类交互,提高复用性
6) 不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好。要以让系统有层次,利于维护为目的



相关文章
|
缓存 NoSQL 关系型数据库
redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿
本文深入探讨了Redis缓存的相关知识,包括缓存的概念、使用场景、可能出现的问题(缓存预热、缓存穿透、缓存雪崩、缓存击穿)及其解决方案。
811 0
redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿
|
9月前
|
存储 Kubernetes 测试技术
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
480 12
|
11月前
|
XML C# 数据格式
一个.NET开源、免费、功能强大的 PDF 处理工具
一个.NET开源、免费、功能强大的 PDF 处理工具
335 8
|
监控 数据管理 测试技术
实现API接口的自动化
API接口自动化测试的最佳实践包括确定测试范围和目标、编写测试用例、选择合适的自动化测试工具、搭建测试环境、编写自动化测试脚本、执行自动化测试、分析测试结果和回归测试。通过这些步骤,可以提高测试效率和质量,确保API的稳定性和可靠性。此外,还介绍了如何利用API接口测试工具进行性能测试和压力测试,以及常见的挑战和解决方案。
|
安全 项目管理 开发工具
探索 GitHub:现代开发者的协作平台
GitHub 是一个基于 Git 的版本控制和协作平台,广泛应用于软件开发和项目管理。它不仅提供代码托管服务,还是开发者社区和开源项目的重要平台。本文介绍了 GitHub 的核心功能(如代码托管、协作工具、CI/CD 集成等)、使用技巧(如规范化提交信息、参与开源项目等),帮助开发者提升效率和协作能力。GitHub 自2008年成立以来,已成为全球最大的代码托管平台,支持团队协作和项目管理。
|
C++ 开发者
如何使生成的exe程序默认以管理员权限启动
如何使生成的exe程序默认以管理员权限启动
279 0
java字符串反转(7种方法)
用stringBuffer或者stringBuilder自带的reverse方法
2502 0
|
Java 数据库连接 数据库
【SSM框架】SSM到底是什么,为什么这么多人使用
【SSM框架】SSM到底是什么,为什么这么多人使用
12041 0
.NET开发中合理使用对象映射库,简化和提高工作效率
.NET开发中合理使用对象映射库,简化和提高工作效率
268 0
|
Android开发 开发者
android应用中去android市场去评分的功能实现(吐槽一波个人应用上线...)
一般的app可能会有这中功能,在应用中去android商店评分来提高排名,前段时间也把我的博客园上传到商店,这里不得不吐槽一些android商店的开放平台。 酷派,vivo,oppo,联想不支持个人开发者……. 有得还要软件著作证书,一个个人开发者,搞个应用练练手,哪有没精力和财力去搞这些玩意。
2722 0