1.外观模式(Facade [fə'sɑd] n. 正面;表面;外观)
外观模式:可以理解为 中介模式(没错,就是在用户与系统之间,增加了一个类,而这个类就是外观类,所以这个模式就叫外观模式)
如下图:
在如下图:
2.代码实现,我们就以第二个图为例子
2.1.首先创建三个子系统类
创建Cpu类:
1 package design.pattern.facade; 2 3 public class Cpu { 4 public void turnOn() { 5 System.out.println("启动CPU"); 6 } 7 8 public void shutdown() { 9 System.out.println("关闭CPU"); 10 } 11 }
同理创建Memery类:
1 package design.pattern.facade; 2 3 public class Memery { 4 public void turnOn() { 5 System.out.println("加载内存"); 6 } 7 8 public void shutdown() { 9 System.out.println("释放内存"); 10 } 11 }
最后创建Disk类:
1 package design.pattern.facade; 2 3 public class Disk { 4 public void turnOn(){ 5 System.out.println("加载硬盘"); 6 } 7 8 public void shutdown(){ 9 System.out.println("关闭硬盘"); 10 } 11 }
2.2. 创建外观类,或者叫 中介类 Computer,为了能够使用多态,这里先创建一个Computer的抽象类
1 package design.pattern.facade; 2 3 /* 4 * Computer就是外观接口类, 5 * 这里是要使用接口或者抽象类的了,到时用户调用的都是这种类型的, 6 * 这样就算我们修改了内部,对用户的操作都没有影响 7 * **/ 8 public abstract class Computer { 9 public abstract void turnOn(); 10 public abstract void shutdown(); 11 }
在创建一个DellComputer继承了Computer类:
1 package design.pattern.facade; 2 3 public class DellComputer extends Computer{ 4 //这个是关键,这里声明为private是防止用户直接去调用这些子系统 5 //保证了用户只能通过外观类来进行访问 6 7 //同时这里也是缺点,当新增子系统是必须手动修改DellComputer 8 private Cpu cpu; 9 private Memery mem; 10 private Disk disk; 11 12 //这个构造方法也很有意思,若没有参数,则自行创建新的子系统,CPU,内存,Disk这些都可以看作子系统 13 public DellComputer(){ 14 this.cpu = new Cpu(); 15 this.mem = new Memery(); 16 this.disk = new Disk(); 17 } 18 19 public DellComputer(Cpu cpu,Memery mem,Disk disk){ 20 this.cpu = cpu; 21 this.mem = mem; 22 this.disk = disk; 23 } 24 25 //下面这两个方法都一样,都是统一调用了3个子系统的方法 26 @Override 27 public void turnOn() { 28 cpu.turnOn(); 29 mem.turnOn(); 30 disk.turnOn(); 31 } 32 33 @Override 34 public void shutdown() { 35 cpu.shutdown(); 36 mem.shutdown(); 37 disk.shutdown(); 38 } 39 40 }
2.3.最后,来使用一下,创建一个用户 Tommy类:
1 package design.pattern.facade; 2 3 public class Tommy { 4 public static void main(String[] args){ 5 Computer com = new DellComputer(); 6 com.turnOn();//开电脑,用户只需要按下开机按钮,CPU,内存,硬盘这些都会自动启动,而不需要用户操心 7 com.shutdown();//关机,同理,难道还得用户一个个的关么··· 8 } 9 }
运行结果:
3.小总结:
3.1. 什么时候使用外观模式:
当用户仅关心调用的接口,而不关心内部运作时,可以尝试使用
3.2. 优点:
使用了中介类嘛,稍微解耦了一下,不过也正因为这个中介类,导致了它不可避免的硬伤
3.3. 缺点:
用户调用这边几乎没什么问题,关键是,当子系统类有变动时(新增、删除、或修改方法),中介类(外观类)必须做修改····
参考链接:http://www.cnblogs.com/dobetter/archive/2012/05/07/2488148.html 和 http://www.cnblogs.com/voidy/p/4234683.html