外观模式
外观模式属于结构型设计模式
定义:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。提供一个高层次的接口,使得子系统更易于使用
外观模式是为了解决类与类之间的责任关系和依赖关系的,通过提供一个Facade类来隐藏这些复杂的类之间关系的调用,并提供一个接口,供外部调用,利用这种方式进行类之间的解耦
优点
- 减少类之间依赖,只对Facade类进行依赖,对Facade类里的复杂的类没有关联
- 提高了灵活性,只对Facade类进行依赖,Facade类内部可自由变化
- 提高安全性,只能对Facade类进行访问,无法访问到Facade类里复杂的类
缺点
不符合开闭原则,如果Facade类设计不好,后期无法通过对Facade类重写覆盖去解决问题,只能改代码
模式代码实现
源码地址:https://github.com/mingyuHub/design-patterns
以汽车启动为例,需要启动引擎,仪表盘,大灯等,有可能需要先启动引擎之后才可以启动仪表盘,或者大灯的启动依赖引擎的启动等,这个时候就需要一个Facade类来隐藏这些复杂的依赖关系
实例涉及的类:Engine(引擎)
,Armaturenbrett(仪表盘)
,Headlight(大灯)
,Car(汽车类,facade类)
Engine
/**
* @author: chenmingyu
* @date: 2019/3/1 14:53
* @description: 引擎
*/
public class Engine {
public void start(){
System.out.println("启动引擎...");
}
}
Armaturenbrett
/**
* @author: chenmingyu
* @date: 2019/3/1 15:02
* @description: 仪表盘
*/
public class Armaturenbrett {
public void start(){
System.out.println("启动仪表盘...");
}
}
Headlight
/**
* @author: chenmingyu
* @date: 2019/3/1 14:53
* @description:
*/
public class Headlight {
public void start(){
System.out.println("启动大灯...");
}
}
Facade类
Car
/**
* @author: chenmingyu
* @date: 2019/3/1 14:57
* @description:
*/
public class Car {
/**
* 发动机
*/
private Engine engine;
/**
* 仪表盘
*/
private Armaturenbrett armaturenbrett;
/**
* 大灯
*/
private Headlight headlight;
public Car() {
this.engine = new Engine();
this.armaturenbrett = new Armaturenbrett();
this.headlight = new Headlight();
}
public void start(){
System.out.println("启动汽车...");
engine.start();
armaturenbrett.start();
headlight.start();
System.out.println("汽车以启动...");
}
}
验证
public static void main(String[] args) {
Car car = new Car();
car.start();
}
输出
启动汽车...
启动引擎...
启动仪表盘...
启动大灯...
汽车以启动...
Car
类封装了启动引擎,仪表盘,大灯等操作,客户端只需要调用car
类的start()
方法即可启动上述组件,而不用去对实例化每个类然后去调用其start()
,利用这种方式进行解耦。
参考:设计模式之禅:https://www.kancloud.cn/sstd521/design/193593
推荐阅读:23种设计模式详解