大家好✋,我是知识汲取者😄,今天给大家带来一篇有关外观模式的学习笔记。众所周知能够熟练使用设计模式是一个优秀程序猿的必备技能,当我们在项目中选择一个或多个合适的设计模式,不仅能大大提高项目的稳健性、可移植性、可维护性,同时还能让你的代码更加精炼,具备艺术美感。
在生活中,外观模式处处可见,电脑的开机按钮、电源开关总闸等等都是拥有外观模式的思想在其中的,同样的在编程世界中,外观模式就显得更为常见了,诸如分层开发,统一的接口设计,一键**这些都可以看作是一个个外观模式的应用,外观模式提供了一个统一的接口让用户更容易操作系统,现在就让我们来好好学习一下这么一个常见且重要的设计模式吧😃
推荐阅读:
- 设计模式导学:🚪传送门
- 每日一个设计模式系列专栏:🚪传送门
- 设计模式专属Gitee仓库:✈启程
- 设计模式专属Github仓库:🚀上路
- 知识汲取者的个人主页:💓点我哦
什么是外观模式?
外观模式(Facade Pattern)又称为门面模式,是一种对象结构型模式,它提供了一个统一高层次的接口,让外界通过该接口访问内部子系统的一群接口
PS:外观模式是迪米特法则的一种具体实现
外观模式的作用:隐蔽子系统的复杂性,简化子系统的接口,让子系统变得更加容易使用
外观模式的优缺点
优点:
……
缺点:
……
外观模式的适用场景
……
生活中的应用:交互机(所有信息都有交互机进行统一分发管理)、导游(旅游景区众多,游客如果想要一一了解则需要花费大量的时间,但是通过导游就可以快速了解)
编程中的应用:Java中的分层开发,也可以说是三层架构,就是利用了外观模式的设计思想,每一层都有一个统一的接口,负责和其它层进行交互,大大降低了系统的耦合度
外观模式的角色划分
示例:
在计算机主机(Host)中,只需要按下主机的开机按钮,即可以调用其他硬件设备和软件的启动方法,如内存(Memory)的自检,CPU的运行,硬盘(HardDisk)的读取,操作系统(OS)的载入等,如果某一过程发生错误则计算机启动失败。使用外观模式模拟该过程,并编程实现。
思考:想象一下如果没有主机上的开关,那么电脑的其它部件都需要我们一个个手动去启动那该是一件多么困难的事情,不仅要熟练掌握每一个部件如何开启,还需要注意每一个部件的开启顺序,而使用外观模式,只需在主机上轻轻一按,电脑就能成功启动了,是不是觉得轻松多了
Step1:创建子系统
1)CPU:
package com.hhxy.computer;/*** @author ghp* @date 2022/10/14* @title CPU* @description*/
public class CPU {public void run(){System.out.println("CPU运行了");}
}
2)硬盘:
package com.hhxy.computer;/*** @author ghp* @date 2022/10/14* @title 硬盘* @description*/
public class HardDisk {public void read(){System.out.println("硬盘开始读取数据");}
}
3)内存:
package com.hhxy.computer;/*** @author ghp* @date 2022/10/14* @title 内存* @description*/
public class Memory {public void check(){System.out.println("内存开始自检");}
}
4)操作系统:
package com.hhxy.computer;/*** @author ghp* @date 2022/10/14* @title 操作系统* @description*/
public class OS {public void load(){System.out.println("操作系统开始载入");}
}
Step2:创建外观类
主机:
package com.hhxy.computer;/*** @author ghp* @date 2022/10/14* @title 主机(外观类)* @description 用于和客户进行交互,统一管理电脑硬件和软件的启动*/
public class Host {CPU cpu;HardDisk hardDisk;Memory memory;OS os;public Host(){cpu = new CPU();hardDisk = new HardDisk();memory = new Memory();os = new OS();}/*** 开机的方法*/public void startUp(){cpu.run();hardDisk.read();memory.check();os.load();}
}
Step3:编写测试类
package com.hhxy.test;import com.hhxy.computer.Host;/*** @author ghp* @date 2022/10/14* @title 测试类2* @description 用于模拟使用外观模式*/
public class Test2 {public static void main(String[] args) {Host host = new Host();host.startUp();}
}
测试结果:
如果不使用外观类,就需要手动启动电脑的每一个部件:
package com.hhxy.test;import com.hhxy.computer.CPU;
import com.hhxy.computer.HardDisk;
import com.hhxy.computer.Memory;
import com.hhxy.computer.OS;/*** @author ghp* @date 2022/10/14* @title 测试类1* @description 用于模拟不使用外观模式*/
public class Test1 {public static void main(String[] args) {//模拟开机CPU cpu = new CPU();cpu.run();HardDisk hardDisk = new HardDisk();hardDisk.read();Memory memory = new Memory();memory.check();OS os = new OS();os.load();}
}
总的来讲外观模式的核心就是:将复杂的东西变得简单
这里的复杂的东西从本个小案例是无法看出来的, 在实际开发中一般会是一堆复杂交错的子系统,并且外观模式的设计也是相当复杂的,从这个案例可能只是窥探其冰山一角,真真想要掌握,往往需要大量的开发经验,这篇文章也是博主首次探索外观模式,期待大家的关注,后续将持续更新设计模式相关内容,往后也会发布设计模式的深度思考和总结性的文章
与外观者模式相关的其它设计模式
自此,文章就结束了,如果觉得本文对你有一丢丢帮助的话😄,欢迎点赞👍+评论✍,您的支持将是我写出更加优秀文章的动力O(∩_∩)O
上一篇:每日一个设计模式之【装饰模式】
下一篇:每日一个设计模式之【享元模式】
下一篇:开发人员体验:最重要的指标