什么是外观模式
Facade 又叫门面模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
模式角色
子系统角色:(Subsystem)可以是一个也可以是多个,子系统是分化的不同的处理模块,不是单独的类。
外观角色:(Facade:)了解子系统所有的方法和任务,此角色有自己的方法,client通过此角色方法来调用子系统的功能。
UML类图
![](https://img.haomeiwen.com/i10195209/1e656f857122e0e0.png)
代码实现
假设我们自己去医院看病需要这样的几个系统
1.选择一个医生(CardPhysician);
2.去医院挂号(Register)
3.分诊台分诊(Triage)
最后我们才能看病.
但如果我们这个时候有就诊渠道(VIPFacade),直接就省略了访问1,2,3这几个系统的步骤。通过VIPFacade来完成看病。
public class CardPhysician {
public void cardPhysician(String pcp) {
System.out.println("选择了一个"+ pcp);
}
}
public class Register {
public void register() {
System.out.println("挂号交钱");
}
}
public class Triage {
public void triage() {
System.out.println("分诊台分诊等待就医.");
}
}
public class VIPFacade {
private CardPhysician cardPhysician;
private Register register;
private Triage triage;
public VIPFacade() {
cardPhysician = new CardPhysician();
register = new Register();
triage = new Triage();
}
public void vipService(String pcp) {
cardPhysician.cardPhysician(pcp);
register.register();
triage.triage();
};
}
public class Client {
public static void main(String[] args) {
//*******************直接调用**********************
CardPhysician cardPhysician = new CardPhysician();
cardPhysician.cardPhysician("内科医生");
Register register = new Register();
register.register();
Triage triage = new Triage();
triage.triage();
//*******************外观模式**********************
VIPFacade vipFacade = new VIPFacade();
vipFacade.vipService("外科医生");
}
}
优点
简化了调用过程,无须了解、深入子系统,防止带来风险
减少系统依赖、松散耦合
更好的划分访问层次
符合迪米特法则,即最少知道原则
缺点
增加子系统、扩展子系统行为容易引入风险
不符合开闭原则
外观模式完整代码
网友评论