java 23种常用设计模式之外观模式(Facade)

来源:互联网 发布:苹果6有信号没网络 编辑:程序博客网 时间:2024/06/05 17:33

         在软件开发系统中,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 startCPU startmenory startdisk startcomputer shutdownCPU shutdownmenory shutdowndisk 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


0 0
原创粉丝点击