设计模式笔记之十 (外观模式)

外观模式

外观模式就是为子系统的一系列相关的接口提供一个整合过的接口,从而减少客户类对这些接口的调用成本。

最近实验室的老总郁闷的很了,因为女秘书因为太过劳累住院了。以前秘书可以做的事情,老总得要自己做了。

这也是为什么我们实验室最近无聊的会开的少的原因:

class MeetingRoom {
    public boolean booking() {
        return true;
    }
    
    public void prepare() {
    }
    public void start() {
    }
}

class Message {
    public void notificate (String name) {
    }
}

class Printer {
    public void print(String content, int copies) {
    }
}

class Devices {
    public void pc () {
    }
    public void projector () {
    }
}

public class Facade {
    public static void main(String[] args) {
        MeetingRoom mr = new MeetingRoom();
        Devices d = new Devices();
        Printer p = new Printer();
        Message m = new Message();
        //预定会议室
        mr.booking();
        //做会议室布置等
        mr.prepare();
        //打印资料
        p.print("这是文件", 20);
        //准备电脑
        d.pc();
        //准备投影仪
        d.projector();
        //通知与会人员开会
        m.notificate("李阿标");
        m.notificate("市场部经理");
        m.notificate("财务部经理");
        m.notificate("兽人工厂厂长");
        mr.start();//开始开会
    }
}

因为秘书不在,老总必须得要做这么多的步骤才能把会开起来,这是任何一个老总都不会干的事情,老总不会把精力放在这么多不同的对象上,所以老总需要女秘书来撑门面:

class NvMiShu {
    private static NvMiShu miShu;
    private static final Object o = new Object();

    private NvMiShu() {
    }
    public static NvMiShu getInstance() {
        if (miShu == null) {
            synchronized (o) {
                if (miShu == null) {
                    miShu = new NvMiShu();
                }
            }
        }
        return miShu;
    }
    
    public void meeting() { 
        //这些开会所需要的流程是女秘书必须掌握的
        MeetingRoom mr = new MeetingRoom();
        Devices d = new Devices();
        Printer p = new Printer();
        Message m = new Message();
        //预定会议室
        mr.booking();
        //做会议室布置等
        mr.prepare();
        //打印资料
        p.print("这是文件", 20);
        //准备电脑
        d.pc();
        //准备投影仪
        d.projector();
        //通知与会人员开会
        m.notificate("李阿标");
        m.notificate("市场部经理");
        m.notificate("财务部经理");
        m.notificate("兽人工厂厂长");
        mr.start();//开始开会
    }
}

public class Facade {
    public static void main(String[] args) {
        //老总只需要将精力放在女秘书身上,而不需要去分别调用不同对象的不同接口
        NvMiShu.getInstance().meeting();
    }
}

有了女秘书之后,老总们不需要和那么多不同的对象打交道了,他只需要把精力放在女秘书这个对象上(为什么听着这么不正经呵,我得再次声明我是一个正直正经的程序猿技术宅),老总这个客户类只需要研究女秘书的接口,而不需要了解其他对象的运作方式了。

装饰者模式,适配器模式,外观模式的区别

以上三种模式经常会有混淆的时候,通常来说:

装饰者模式是在不改变原有对象的接口的情况下扩展出新的接口来方便客户端使用,比如: InputStream 和 DataInputStream 之间就是装饰者模式, DataInputStream 既有InputStream的read接口,又扩展了一些读字符的方法如readBoolean等

InputStream is = null;
DataInputStream dis = new DataInputStream(is);
dis.readBoolean();

适配器模式是改变原有对象的接口,使之变得适应新的需求即新客户类的调用,比如InputStream和Reader之间就是适配器模式

外观模式是简化接口的调用,使多个相关的接口有一个统一的接口调用

 

posted @ 2013-05-21 11:04  biglaojiang  阅读(1355)  评论(1编辑  收藏  举报