设计模式--外观模式

一、举个栗子
小明每天回家都会先打开灯,空气净化器,电热水器烧上水,放上音乐,如果天气热的话,再打开空调。
写成代码

lights.on();//打开灯
airCleaner.on();//打开空气净化器
airCleaner.setMode(auto);//设置自动模式
waterHeater.on();//打开电热水器
waterHeater.setTemperature(40);//水温40度
player.on();//打开音响
play.play(music);//放上音乐
...
//涉及到太多类了!!!

出门的时候,还得反向操作把它们都关掉。
如果升级了系统,还得重新学习另一套操作流程。
那么就使用外观模式来改造成智能家居吧。

二、设计思路
1、创建一个名为HomeFacade新类,对外暴露几个简单的方法,如open()
2、这个新类把灯,音响,空调等视为子系统,让open()去调用他们
3、客户端去调用HomeFacade所提供的方法,而无须再分步骤调用子系统,就可以完成所有操作


image.png

外观只提供更直接的操作,并没有将原来的子系统隔离起来,还是可以调用原来的子系统的。

具体实现:

public class HomeFacade {
  //所用到的子系统组件
  musicPlayer player;
  Light light;
  ...
  //将子系统的每个组件传入构造器,并赋值给实例变量
  public HomeFacade(musicPlayer player, Light light, ...) {
    this.player = player;
    this.light = light;
    ...
  }
  public void open() {
    lights.on();//打开灯
    airCleaner.on();//打开空气净化器
    airCleaner.setMode(auto);//设置自动模式
    waterHeater.on();//打开电热水器
    waterHeater.setTemperature(40);//水温40度
    player.on();//打开音响
    play.play(music);//放上音乐
  }
  public void endMovie() {
    lights.off();
    airCleaner.off();
    waterHeater.();
    ...
  }
}

//进家门
public class HomeTestDrive {
  public static void main(String[] args) {
    HomeFacade home = new HomeFacade(player, light, ...);
    //使用简化的接口,打开各种电器,然后关闭各种电器
    home.open();
    home.close();
  }
}

三、外观模式
1、定义:
外观模式提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。
外观模式封装了子系统的操作,暴露一个统一的接口让用户使用,避免了用户需要与多个子系统进行交互,降低了系统的耦合度、复杂度。如果没有外观模式的封装,那么用户就必须知道各个子系统的相关细节,子系统之间的交互必然造成纠缠不清的关系,影响系统的稳定性、复杂度。
2、类图


image.png

Tips:
最少知识原则:要减少对象间的交互,只和密友交谈。也就是说,不要让太多的类耦合在一起,避免修改系统中的一部分,会影响其他部分,如果许多类之间相互依赖,那这个系统的维护成本就会很高,也不容易被他人了解。

3、与装饰者模式,适配器模式的区别
装饰者模式是将一个对象包装起来,增加新的行为和责任


image.png

适配器模式是现有类的接口不符合需要,必须转换成不同的接口,(将一个对象包装起来改变接口)以符合客户的期望
外观模式可以简化并统一一个很大很复杂的接口,(将对象“包装”起来简化接口)将用户从组件的子系统中解耦


image.png

四、外观模式在Android中的应用
在Android中,Context是最重要的一个类型。它封装了很多重要的操作,比如startActivity()、sendBroadcast()等,这些功能内部的实现非常复杂,但是我们无需关心它内部实现了什么,我们只关心它帮我们启动Activity,帮我们发送了一条广播,绑定了Activity等等就够了。
Context是一个抽象类,它只是定义了抽象接口,真正的实现在ContextImpl类中,在ContextImpl内部有很多xxxManager类的对象,也就是前面所说的各种子系统。
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,896评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,283评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,085评论 0 367
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,010评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,015评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,492评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,858评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,829评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,374评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,409评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,527评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,131评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,858评论 3 339
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,296评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,434评论 1 276
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,087评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,597评论 2 366

推荐阅读更多精彩内容

  • 目录 本文的结构如下: 什么是外观模式 模式的结构 代码示例 优点和缺点 适用环境 模式应用 模式扩展 补充 一、...
    w1992wishes阅读 641评论 0 1
  • 文摘一:有些地方外观模式也被叫做门面模式,英文即Facade Pattern,提前说明一下。 试想这种情况,用户添...
    _浅墨_阅读 487评论 0 1
  • 前言 Android的设计模式系列文章介绍,欢迎关注,持续更新中: Android的设计模式-设计模式的六大原则一...
    四月葡萄阅读 4,933评论 2 16
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,951评论 1 15
  • 昨天晚上我就一直很兴奋,因为我们发起了一个为养哈利的义卖义演,而时间就在今天上午了。一大早醒来,我就听见了窗外稀里...
    YvonneZhu阅读 313评论 2 4