介绍
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。
类图说明
本类图中定义一个ICar接口,并定义三个BMW、Benz、TESLA类实现该接口,并各自实现run()方法。然后定义一个Facade类,该类引入BMW、Benz、TESLA对象并实例化,并分别定义接口开放给到客户端访问。FacadePattern只需实例化Facade,并且调用Facade包装好的drivexxx方法即可,无需关心子系统内部接口是如何提供的。
代码示例
文件结构如下:
代码示例如下:
public interface ICar {
void run();
}
public class Benz implements ICar {
@Override
public void run() {
System.out.println("奔驰车运行中。。");
}
}
public class BMW implements ICar {
@Override
public void run() {
System.out.println("宝马车运行中。。");
}
}
public class TESLA implements ICar {
@Override
public void run() {
System.out.println("特斯拉运行中。。");
}
}
public class Facade {
private Benz benz;
private BMW bmw;
private TESLA tesla;
public Facade(){
this.benz = new Benz();
this.bmw = new BMW();
this.tesla = new TESLA();
}
public void driveBenz(){
this.benz.run();
}
public void driveBMW(){
this.bmw.run();
}
public void driveTESLA(){
this.tesla.run();
}
}
public class FacadePattern {
public static void main(String[] args) {
Facade facade = new Facade();
facade.driveBenz();
facade.driveBMW();
facade.driveTESLA();
}
}
运行结果如下:
应用场景
- 为复杂的模块或子系统提供外界访问的模块
- 子系统相对独立
- 预防低水平人员带来的风险
优缺点
优点
- 减少系统相互依赖
- 提高灵活性
- 提高了安全性
- 在层次化结构中,可以使用外观模式定义系统中每一层的入口
缺点
- 不符合开闭原则,如果要改东西很麻烦,继承重写都不合适