1.外观模式(Facade [fə'sɑd] n. 正面;表面;外观)
外观模式:可以理解为 中介模式(没错,就是在用户与系统之间,增加了一个类,而这个类就是外观类,所以这个模式就叫外观模式)
如下图:
在如下图:
2.代码实现,我们就以第二个图为例子
2.1.首先创建三个子系统类
创建Cpu类:
package design.pattern.facade; public class Cpu {
public void turnOn() {
System.out.println("启动CPU");
} public void shutdown() {
System.out.println("关闭CPU");
}
}
同理创建Memery类:
package design.pattern.facade; public class Memery {
public void turnOn() {
System.out.println("加载内存");
} public void shutdown() {
System.out.println("释放内存");
}
}
最后创建Disk类:
package design.pattern.facade; public class Disk {
public void turnOn(){
System.out.println("加载硬盘");
} public void shutdown(){
System.out.println("关闭硬盘");
}
}
2.2. 创建外观类,或者叫 中介类 Computer,为了能够使用多态,这里先创建一个Computer的抽象类
package design.pattern.facade; /*
* Computer就是外观接口类,
* 这里是要使用接口或者抽象类的了,到时用户调用的都是这种类型的,
* 这样就算我们修改了内部,对用户的操作都没有影响
* **/
public abstract class Computer {
public abstract void turnOn();
public abstract void shutdown();
}
在创建一个DellComputer继承了Computer类:
package design.pattern.facade; public class DellComputer extends Computer{
//这个是关键,这里声明为private是防止用户直接去调用这些子系统
//保证了用户只能通过外观类来进行访问 //同时这里也是缺点,当新增子系统是必须手动修改DellComputer
private Cpu cpu;
private Memery mem;
private Disk disk; //这个构造方法也很有意思,若没有参数,则自行创建新的子系统,CPU,内存,Disk这些都可以看作子系统
public DellComputer(){
this.cpu = new Cpu();
this.mem = new Memery();
this.disk = new Disk();
} public DellComputer(Cpu cpu,Memery mem,Disk disk){
this.cpu = cpu;
this.mem = mem;
this.disk = disk;
} //下面这两个方法都一样,都是统一调用了3个子系统的方法
@Override
public void turnOn() {
cpu.turnOn();
mem.turnOn();
disk.turnOn();
} @Override
public void shutdown() {
cpu.shutdown();
mem.shutdown();
disk.shutdown();
} }
2.3.最后,来使用一下,创建一个用户 Tommy类:
package design.pattern.facade; public class Tommy {
public static void main(String[] args){
Computer com = new DellComputer();
com.turnOn();//开电脑,用户只需要按下开机按钮,CPU,内存,硬盘这些都会自动启动,而不需要用户操心
com.shutdown();//关机,同理,难道还得用户一个个的关么···
}
}
运行结果:
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