设计模式 -- 外观模式

137 阅读2分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。

1.外观模式的简介

外观模式(Facade),也叫过程模式:主要特点使对外屏蔽内部系统的复杂性,内层可以封装多个复杂的子系统,对外暴露一个可以允许统一访问的外层接口,而不必关心内部系统的复杂性,提高子系统的扩展和可维护性。它属于一种结构型设计模式。

外观模式可以大大降低子系统与客户端之间的耦合性,即子系统的改变不会影响客户端的调用。此外它简化了客户端的调用程序,只需调用统一的外部访问接口即可。但它违反了开闭原则:即当需要增加新的子系统时,可能需要修改源码。

举个例子:我们出行政大厅办事,进去后里面有很多个办事窗口,如户籍管理,学籍管理,出入境管理等。这些一个个办事窗口,我们可以把它看成一个个复杂的子系统。而行政大厅就是对我们暴露的外部访问接口。当我们需要访问多个子系统时,只需要找到行政大厅即可。

2.uml类图

image.png

大家可以看到这里的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 ");
   }

}
  1. 子系统:户籍管理系统
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 ");
   }

}
  1. 父系统:统一管理子系统
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,其实这也是外观模式的一种简单实现。