定义
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。
UML
Facade:这个外观类为子系统提供一个共同的对外接口
Clients:客户对象通过一个外观接口读写子系统中各接口的数据资源。
实例
1.比如一个家庭影院,我们需要看电影,肯需要先打开电视机,音响,调节灯光,炸爆米花,准备可乐等一系列的动作,调用电视机,音响、微波炉等子系统的各种接口,但是我们将这些接口定义好放在一个高层接口中,选择看电影由这个高层接口调用各子系统完成自己的工作。
2.启动电脑,需要cpu 内存等各组建工作,而电脑给了一个开机按钮就是一个外观模式,让人(客户)可以按一个按钮而启动各组建,不用一个个处理。
/* Complex parts */ class CPU { public void freeze() { ... } public void jump(long position) { ... } public void execute() { ... } } class Memory { public void load(long position, byte[] data) { ... } } class HardDrive { public byte[] read(long lba, int size) { ... } } /* Façade */ class Computer { public void startComputer() { cpu.freeze(); memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE)); cpu.jump(BOOT_ADDRESS); cpu.execute(); } } /* Client */ class You { public static void main(String[] args) { Computer facade = new Computer(); facade.startComputer(); } }
优点
(1)实现了子系统与客户端之间的松耦合关系。
(2)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。
缺点
使用场景
(1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
(2) 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
(3) 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。
注:
1.Facade模式不仅简化了整个组件系统的接口,同时从某种程度上也达到了一种“解耦”的效果----内部子系统的任何变化不会影响到Facade接口的变化。 Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facdae很多时候更是一种架构
2. 在设计外观时,不需要增加额外的功能,不要从外观方法中返回子系统中的组件给客户,应用外观的目的是提供一个高层次的接口。因此,外观方法最适合提供特定的高层次的业务服务,而不是进行底层次的单独的业务执行。
3.注意区分Facade模式、Adapter模式、Bridge模式与Decorator模式。Facade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。