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