「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。
1.外观模式的简介
外观模式(Facade),也叫过程模式:主要特点使对外屏蔽内部系统的复杂性,内层可以封装多个复杂的子系统,对外暴露一个可以允许统一访问的外层接口,而不必关心内部系统的复杂性,提高子系统的扩展和可维护性。它属于一种结构型设计模式。
外观模式可以大大降低子系统与客户端之间的耦合性,即子系统的改变不会影响客户端的调用。此外它简化了客户端的调用程序,只需调用统一的外部访问接口即可。但它违反了开闭原则:即当需要增加新的子系统时,可能需要修改源码。
举个例子:我们出行政大厅办事,进去后里面有很多个办事窗口,如户籍管理,学籍管理,出入境管理等。这些一个个办事窗口,我们可以把它看成一个个复杂的子系统。而行政大厅就是对我们暴露的外部访问接口。当我们需要访问多个子系统时,只需要找到行政大厅即可。
2.uml类图
大家可以看到这里的UML类图还是很简单的,不过在我们日常开发中,需要注意,我们是把子系统放在外观系统类中统一管理方便,还是直接调用子系统模块方便,根据需求选择是否使用外观模式。
3.代码举例
1.子系统:学籍管理系统
public class XuejiSystem {
private static XuejiSystem instance = new XuejiSystem();
public static XuejiSystem getInstance() {
return instance;
}
public void in() {
System.out.println(" XuejiSystem in ");
}
public void out() {
System.out.println(" XuejiSystem out ");
}
}
- 子系统:户籍管理系统
public class FamilySystem {
private static FamilySystem instance = new FamilySystem();
public static FamilySystem getInstance() {
return instance;
}
public void in() {
System.out.println(" familySystem in ");
}
public void out() {
System.out.println(" familySystem out ");
}
}
3.子系统:出入境管理
public class OutSystem {
private static OutSystem instance = new OutSystem();
public static OutSystem getInstance() {
return instance;
}
public void in() {
System.out.println(" OutSystem in ");
}
public void out() {
System.out.println(" OutSystem out ");
}
}
- 父系统:统一管理子系统
public class XingZhengFacade {
//定义各个子系统对象
private XuejiSystem xuejiSystem;
private FamilySystem familySystem;
private OutSystem outSystem;
//构造器
public XingZhengFacade() {
super();
this.xuejiSystem = XuejiSystem.getInstance();
this.familySystem = FamilySystem.getInstance();
this.outSystem = OutSystem.getInstance();
}
//各个子系统调用
public void xuejiSystemIn (){
xuejiSystem.in();
}
public void xuejiSystemOut (){
xuejiSystem.out();
}
public void familySystemIn (){
familySystem.in();
}
public void familySystemOut (){
familySystem.out();
}
public void outSystemIn (){
outSystem.in();
}
public void outSystemOut (){
outSystem.out();
}
//调用多个子系统
public void all(){
xuejiSystem.in();
xuejiSystem.out();
familySystem.in();
familySystem.out();
outSystem.in();
outSystem.out();
}
}
这里大家可以发现,相对于直接调用子系统,外观模式下,可以很方便的调用不同的系统。
4.应用案例
这里的应用案例我感觉挺多的,包括我们日常开发时,一个Controller中会调用多个Service,而一个Service也可能会调用多个Dao,其实这也是外观模式的一种简单实现。