在软件开发系统中,client程序经常要与复杂系统的内部子系统之间产生耦合,而导致client程序随着子系统的变化而变化。那么问题来了!如何简化client程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?
外观模式为子系统中的一组接口提供一个统一的高层接口,解决类与类之间的依赖关系。这一接口使得子系统更加容易使用,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口,这里我就不编故事了,直接来看一个最经典的例子,计算机的启动过程。
没有故事写不下去了,还是来个小故事娱乐一下这个类图吧!
有天有个老黑(User),觉得很无聊,于是打算自己组装个Computer,费了九牛二虎之力,在我cover机箱(facade)之前能不能先试试这个computer能不能打开呢?
于是他先后startup了CPU、Memory、Disk……成功街上显示屏玩了会植物大战僵尸,这样一块一块的这是玩的不爽,就逐个shutdown。还是用Facade先cover成一个完整的Computer,这样老黑就不需要这么麻烦了,直接startup Computer就直接帮老黑把CPU、Memory、Disk……这些启动了!要关机(shutdown)就直接把CPU之类的shutdown了!CPU、Memory、Disk这些类相对独立,在computer类中进行配置,高效的解决类与类之间的依赖关系。
详细代码如下:
package com.freedom.facade;
public class CPU {
public void startup(){
System.out.println("CPU start");
}
public void shutdown(){
System.out.println("CPU shutdown");
}
}
package com.freedom.facade;
public class Memory {
public void startup(){
System.out.println("menory start");
}
public void shutdown(){
System.out.println("menory shutdown");
}
}
package com.freedom.facade;
public class Disk {
public void startup(){
System.out.println("disk start");
}
public void shutdown(){
System.out.println("disk shutdown");
}
}
package com.freedom.facade;
public class Computer {
private CPU cpu;
private Memory memory;
private Disk disk;
public Computer(){
cpu = new CPU();
memory = new Memory();
disk = new Disk();
}
public void startup(){
System.out.println("computer start");
cpu.startup();
memory.startup();
disk.startup();
}
public void shutdown(){
System.out.println("computer shutdown");
cpu.shutdown();
memory.shutdown();
disk.shutdown();
}
}
package com.freedom.facade;
public class User {
public static void main(String[] args) {
Computer computer = new Computer();
computer.startup();
computer.shutdown();
}
}
/*
运行结果:
computer start
CPU start
menory start
disk start
computer shutdown
CPU shutdown
menory shutdown
disk shutdown
*/
如果没有Computer类,那么,CPU、Memory、Disk他们之间将会相互持有实例,产生关系,这样会造成严重的依赖,修改一个类,可能会带来其他类的修改,这是很多人不想要看到的,有了Computer类,他们之间的关系被放在了Computer类里,这样就起到了解耦的作用!
小结:从客户程序的角度来看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果----内部子系统的任何变化不会影响到Facade接口的变化。
Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facdae很多时候更是一种架构设计模式。
注意区分Facade模式、Adapter模式、Bridge模式与Decorator模式:
Facade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。
下载源码:http://download.csdn.net/detail/github_22022001/8328447