设计模式之外观模式

  注意:如果不想浪费时间,请一定要点我

  我们之前学过使用适配器模式可以将一个接口转化成用户期望的另一个接口,我们今天看的新模式是将为了简化接口,它将一个或者数个类的复杂的一切隐藏在背后,只显露出一个干净美好的外观。

  1. 定义
      通过为多个复杂的子系统提供一个一致的接口,而是这些子系统更加容易使用。
      外观模式是迪米特法则的典型应用,它主要有以下优点:
      (1)由于客户不是直接使用子系统,降低了子系统和用户的耦合度,使得子系统的变化对用户来说是透明的。
      (2)对用户隐藏了子系统的复杂情况,使得用户更加容易使用。
      但是外观模式违背了开闭原则,因为每增加一个子系统,都必须修改外观类。

  2. 外观模式的结构和实现
      外观模式主要是定义了一个高层接口,它包含了多个子系统的引用,客户端可以通过它访问各个子系统的功能。
      外观模式主要包括以下主要角色:
      (1)外观角色:为多个子系统对外提供了一个共同的接口。
      (2)子系统角色:实现系统的部分功能,客户可以通过外观角色访问它。


    外观模式

  比如我们想在家看一步电影,我们必须执行一些任务。
  (1)打开爆米花机开始爆米花。
  (2)关灯。
  (3)打开投影机,选择合适的宽度。
  (4)打开播放器,选择电影,然后开始播放。
  不止如此,在你看完电影,还得将这一切收拾掉,我们将这些写成类和方法的调用,看看播放电影,我们到底需要做多少工作。

class Light{
    public void turnOff() {
        System.out.println("关灯");
    }
    public void turnOn() {
        System.out.println("开灯");
    }
}

class PopcornMachine{
    public void popper() {
        System.out.println("打开爆米花机,并开始爆米花");
    }
    public void unPopper() {
        System.out.println("关闭爆米花机");
    }
}
class Projector{
    public void turnOn() {
        System.out.println("打开投影仪");
    }
    public void adjust() {
        System.out.println("调整合适的屏幕大小");
    }
    ......
}
class Player{
    public void turnOn() {
        System.out.println("打开播放器");
    }
    public void chooseMovie() {
        System.out.println("选择合适的电影,然后播放");
    }
    ......
}
class People{
    public void watchMoveAtHome() {
        PopcornMachine pm = new PopcornMachine();   
        Light lt = new Light();
        Projector pj= new Projector();
        Player pl = new Player();
        pm.popper();
        pj.turnOn();
        pj.adjust();
        lt.turnOff();
        pl.turnOn();
        pl.chooseMovie();
    }
}

  看完电影,我们同样需要关闭播放器、投影仪、开灯等等很多的工作。所以,我们只需要使用外观模式,将这些复杂的操作隐藏在一个接口中更容易使用,对我们来说我们不必了解子系统是如何运作的。如下所示,我们可以定义一个类,通过该类对底层子系统进行调用,我们只需要使用该外观类提供的简单接口即可。

class HomeMoivePlay{
     PopcornMachine pm = new PopcornMachine();   
     Light lt = new Light();
     Projector pj= new Projector();
     Player pl = new Player();
     public void playMoive() {
         pm.popper();
         pj.turnOn();
         pj.adjust();
         lt.turnOff();
         pl.turnOn();
         pl.chooseMovie();
     }
     ......
}
class People{
    public void watchMovie(){
          HomeMoivePlay hmp = new HomeMoivePlay();
          hmp.playMoive();
    }
}
  1. 外观模式的应用场景
      (1)在设计初期,应该有意识的将不同的两个层分离,比如典型的三层架构,层与层之间建立外观,使得耦合度大大降低。
      (2)在开发阶段,子系统因为系统的逐渐完善变得越来越复杂,给外部调用的用户带来了巨大的困扰,所以可以定义一个外观,提供一个简单的接口供用户使用。
      (3)在维护一个遗留的大型系统时,可能该系统已经变的难以维护和扩展,但是新的系统必须和该系统进行交互,因为该系统包含重要的功能,所以可以为遗留的系统设计一个外观类,使新系统直接和该外观类进行交互。

  2. 关于外观模式的一些问题
    (1)外观系统中,用户如何接触最底层的子系统?
      外观系统并没有 "封装" 子系统,只是提供了一个简化的接口,如果用户想要直接使用底层功能,依然可以直接使用子系统。
    (2)除了提供一个简化的接口,外观模式还有没有其他的优点?
      外观模式使得用户和子系统解耦,如果客户端实现是针对外观而不是针对子系统编写时,当子系统变化不需要修改客户端,直接修改外观类即可,比如看电影的过程中加了一个新的行为买可乐。客户端并不需要修改。
    (3)外观会新增功能吗?还是直接负责请求转发?
      外观模式当然可以新增功能,使子系统的使用更加方便。
    (4)可以说,外观模式和适配器模式的差异在于适配器包装一个类,而外观包装多个类?
      这句话不对,适配器也可以适配多个类,外观也可以为一个有复杂接口的类提供简化的接口,他们的意图不同,适配器模式的意图在于转化接口,而外观在于简化接口。

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

推荐阅读更多精彩内容