什么是天才!我想,天才就是勤奋的结果。——郭沫若
设计模式学习,近期我会把23种设计模式都写成博客,敬请期待~
—2021/1/11
定义
外观模式也称之为过程模式,外观模式 通过定义一个对外开放的接口,用来屏蔽子类的细节(具体代码实现),使得调用端只需要和这个接口发生关系,而不需要关心子类细节(具体代码实现);
使用场景
- 设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
- 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
外观模式通俗的说就是’缓冲层’;
分析
UML类图(1.1)
:
由UML类图(1.1)
可见,在交互的时候客户端需要和每个功能交互
每个功能又有一定的联系,比如我打开电脑的同时可以打开空调,打电话的时候也可以看电视
这样的话交互起来不仅不利于管理,而且代码耦合性也特别高
这时候就用到了外观模式,往中间加一层’缓冲层’;
UML类图(1.2)
:
由UML类图(1.2)
可以看出,在客户端交互的时候只与缓冲层交互,不用关心各个子类的细节(具体实现代码),这就是外观模式
代码实现
AirConditioner 空调类
public class AirConditioner {
private static AirConditioner instance = new AirConditioner();
private AirConditioner(){
}
public static AirConditioner getInstance(){
return instance;
}
public void open(){
Log.i("外观模式","打开了空调");
}
public void close(){
Log.i("外观模式","关闭了空调");
}
}
Phone手机类
public class Phone {
private static Phone instance = new Phone();
private Phone(){
}
public static Phone getInstance(){
return instance;
}
void open(){
Log.i("外观模式","打开了手机");
}
public void close(){
Log.i("外观模式","关闭了手机");
}
public void connectWiFi(){
Log.i("外观模式","手机 连接了WiFi");
}
}
Computer电脑类
public class Computer {
private static Computer instance = new Computer();
private Computer(){
}
public static Computer getInstance(){
return instance;
}
public void open(){
Log.i("外观模式","打开了电脑");
}
public void close(){
Log.i("外观模式","关闭了电脑");
}
}
Television电视类
public class Television {
private static Television instance = new Television();
private Television(){
}
public static Television getInstance(){
return instance;
}
void open(){
Log.i("外观模式","打开了电视");
}
void close(){
Log.i("外观模式","关闭了电视");
}
}
Facade缓冲层:
public class Facade {
//空调
private final AirConditioner airConditioner;
//电脑
private final Computer computer;
//电视
private final Television television;
//手机
private final Phone phone;
//获取实例
public Facade() {
airConditioner = AirConditioner.getInstance();
computer = Computer.getInstance();
television = Television.getInstance();
phone = Phone.getInstance();
}
//打开 空调 电脑 电视 手机
public void open() {
airConditioner.open();
computer.open();
television.open();
phone.open();
}
//连接手机WIFI
public void connectWiFi() {
phone.connectWiFi();
}
public void close(){
airConditioner.close();
computer.close();
television.close();
phone.close();
}
}
测试代码:
Facade facade = new Facade();
打开 空调 电脑 电视 手机
facade.open();
Log.i("外观模式","=====================");
//连接手机WIFI
facade.connectWiFi();
Log.i("外观模式","=====================");
facade.close();
Log图(2.1)
:
优点:
- 外观模式对外观屏蔽了子系统的细节,因此降低了客户端对子系统使用的复杂性
- 通过合理的使用外观模式,可以帮我们更好的划分层次
- 实现了客户端与子系统的松耦合
切记:
不能为了使用外观模式而使用外观模式!如果说只有简单的两个类就没必要直接使用外观模式,直接调用即可,外观模式是用来解决稍微复杂的子类.要以利于维护为目的
原创不易,您的点赞就是对我最大的支持,记得点赞哦~