外观模式

1.外观模式概念

适配器模式(Adapter Pattern)提供一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。这句话是《Head First Design Patterns》中文版里的,看起来感觉解释得不是很清楚,但是用里面的一个例子解释可能会更容易理解,这个例子是关于某人要组建一个家庭影院,这个家庭影院包含的设备有DVD播放器,投影机,自动屏幕,立体环绕声和爆米花机。那么当他要享受一下这个家庭影院的时候,它要执行以下行为:
-->打开爆米花机,开始做爆米花
-->将灯光调暗
-->放下屏幕
-->打开投影仪
...
当“享受”完这个家庭影院后,又要执行以下的关闭操作:
-->关了爆米花机
-->关闭音响
-->收起屏幕
-->关闭投影仪
...
如果要花那么多时间做这些功夫,还不如去电影院。
所以外观模式就是希望能将这个多工作都简化成我只需要按一个按钮,就能开始看电影,按钮一个按钮,就能关闭所以的设备。

2.使用场景

去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。

3.优点和缺点

优点
1、减少系统相互依赖。
2、提高灵活性。
3、提高了安全性。
缺点
不符合开闭原则,如果要改东西很麻烦,继承重写都不合适

4.例子解析

直接附上《Head First Design Patterns》的外观模式类图:

外观模式类图

下面的例子就是关于开头提到的家庭影院:
家庭影院组成:(把家庭影院当作子系统)
设备一:爆米花机

public class PopcornPopper {

    String name = "爆米花机";
    public PopcornPopper() {
        
    }
    public void on() {
        System.out.println("打开 "+name);
    }
    public void pop() {
        System.out.println("正在制作爆米花");
    }
    public void off() {
        System.out.println("关闭 "+name);
    }
}

设备二:灯光调节

public class TheaterLights {

    public TheaterLights() {
        // TODO Auto-generated constructor stub
    }
    public void dim(int i) {
        System.out.println("灯光调暗到"+i+"%的亮度");
    }
    public void on() {
        System.out.println("打开灯光");
    }
    public void off() {
        System.out.println("关灯");
    }
}

其他设备就省略了,具体可以看源码。
然后就是“一键观影”和“一键关影”的遥控器了
遥控器:Facade

public class HomeTheaterFacade {

    Amplifier amplifier;
    CdPlayer cdPlayer;
    DvdPlayer dvdPlayer;
    PopcornPopper popper;
    Projector projector;
    Screen screen;
    TheaterLights lights;
    Tuner tuner;

    public HomeTheaterFacade(Amplifier amplifier, CdPlayer cdPlayer,
            DvdPlayer dvdPlayer, PopcornPopper popper, Projector projector,
            Screen screen, TheaterLights lights, Tuner tuner) {
         this.amplifier = amplifier;
         this.cdPlayer = cdPlayer;
         this.dvdPlayer = dvdPlayer;
         this.popper = popper;
         this.projector = projector;
         this.screen = screen;
         this.lights = lights;
         this.tuner = tuner;
    }
    public void watchMovie(String movie) {
        System.out.println("老司机即将开车,即将播放电影《"+movie+"》================");
        popper.on();
        popper.pop();
        lights.dim(10);
        screen.down();
        projector.on();
        amplifier.on();
        dvdPlayer.on();
        dvdPlayer.play(movie);
    }
    public void endMovie() {
        System.out.println("老司机催促各位乘客下车,电影结束================");
        popper.off();
        lights.on();
        screen.up();
        projector.off();
        amplifier.off();
        dvdPlayer.off();

    }
}

客户端:

public class Test {
    public static void main(String[] args) {
        HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade(
                new Amplifier(), new CdPlayer(), new DvdPlayer(),
                new PopcornPopper(), new Projector(), new Screen(),
                new TheaterLights(), new Tuner());
        homeTheaterFacade.watchMovie("白雪公主和七个小矮人");
        System.out.println("\n");
        homeTheaterFacade.endMovie();
    }
}

5.总结

这些在网上和《Head First Design Pattern》都能找到,写这篇文章是为了帮助自己对知识加深了解,记录当时是怎么想的。人的大脑就那么一个,记录的东西有限,要把大脑当成CPU来使用,而不是当作硬盘来存储。

6.源码地址

http://download.csdn.net/detail/lgywsdy/9750138

7.参考文章

http://www.runoob.com/design-pattern/facade-pattern.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容