了解设计模式 之 结构模式(五) -- 外观模式

 
5. 外观模式(Facade Pattern)

外观模式在结构上并不复杂,就是给内部的子系统提供一个统一的接口,来举一个现实点的例子。

还是举方便面厂的例子吧(其实我不喜欢吃方便面的)。方便面的生产流程是很复杂的,包括和面机去和面,面饼要压片,蒸熟,然后是切割面饼,然后油炸,之后是冷却,然后加入调料包等等自动包装。这个过程如果用Java语言描述的话是很复杂的,会包括很多类和方法。就上边所说的过程而言,包括的类有:MixingMachine(和面机),RollingMachine(压片机),CookingMachine(蒸熟机),CuttingMachine(切割面饼机),FryingMachine(油炸机),CoolingMachine(冷却机),PackingMachine(自动包装机)。这样,当客户端要调用这些机器去生产方便面的时候,代码应该是类似这样的:

Java代码 复制代码  收藏代码
  1. public class Client {   
  2.   
  3.     public static void main(String[] args) {   
  4.         // 生产方便面所用的机器对象的初始化   
  5.   
  6.         // 和面   
  7.         mixingMachine.mix();   
  8.         // 压片   
  9.         rollingMachine.roll();   
  10.         // 蒸熟   
  11.         cookingMachine.cook();   
  12.         // 切割面饼   
  13.         cuttingMachine.cut();   
  14.         // 油炸   
  15.         fryingMachine.fry();   
  16.         // 冷却   
  17.         coolingMachine.cool();   
  18.         // 自动包装   
  19.         packingMachine.pack();   
  20.   
  21.     }   
  22.   
  23. }  


那么每生产一袋方便面都要重复这样一个复杂的过程,这个时候,可以使用外观模式来简化这个过程,首先定义一个外观类:

Java代码 复制代码  收藏代码
  1. public class InstantNoodleFacade {   
  2.     private MixingMachine mixingMachine;   
  3.     private RollingMachine rollingMachine;   
  4.     private CookingMachine cookingMachine;   
  5.     private CuttingMachine cuttingMachine;   
  6.     private FryingMachine fryingMachine;   
  7.     private CoolingMachine coolingMachine;   
  8.     private PackingMachine packingMachine;   
  9.   
  10.     public InstantNoodleFacade(MixingMachine mixingMachine, RollingMachine rollingMachine,   
  11.             CookingMachine cookingMachine, CuttingMachine cuttingMachine,   
  12.             FryingMachine fryingMachine, CoolingMachine coolingMachine,   
  13.             PackingMachine packingMachine) {   
  14.         this.mixingMachine = mixingMachine;   
  15.         this.rollingMachine = rollingMachine;   
  16.         this.cookingMachine = cookingMachine;   
  17.         this.cuttingMachine = cuttingMachine;   
  18.         this.fryingMachine = fryingMachine;   
  19.         this.coolingMachine = coolingMachine;   
  20.         this.packingMachine = packingMachine;   
  21.     }   
  22.   
  23.     public void makeInstantNoodle() {   
  24.         // 和面   
  25.         mixingMachine.mix();   
  26.         // 压片   
  27.         rollingMachine.roll();   
  28.         // 蒸熟   
  29.         cookingMachine.cook();   
  30.         // 切割面饼   
  31.         cuttingMachine.cut();   
  32.         // 油炸   
  33.         fryingMachine.fry();   
  34.         // 冷却   
  35.         coolingMachine.cool();   
  36.         // 自动包装   
  37.         packingMachine.pack();   
  38.     }   
  39. }  


这个Facade对每个机器的动作进行了封装,并提供了统一的接口#makeInstantNoodle()来实现方便面的生产。

下面来看一下是用了Facade的客户端代码:

Java代码 复制代码  收藏代码
  1. public class Client {   
  2.   
  3.     public static void main(String[] args) {   
  4.         // 生产方便面所用的机器对象的初始化   
  5.            
  6.         InstantNoodleFacade facade = new InstantNoodleFacade(......);   
  7.         facade.makeInstantNoodle();   
  8.   
  9.     }   
  10.   
  11. }  


这样,就通过外观模式实现了一个简单的用户视图,实现了复杂子系统的简化。

除此之外,还可以在子系统和客户端之间加入一个Facade来解耦,让子系统拥有更好的独立性和可移植性,并且可以简化它们之间的依赖。

最后给出外观模式的类图:

  • 大小: 11.1 KB
  • 查看图片附件

你可能感兴趣的:(了解设计模式 之 结构模式(五) -- 外观模式)