美文网首页
设计模式 -- 外观模式

设计模式 -- 外观模式

作者: 皆为序幕_ | 来源:发表于2019-07-26 16:23 被阅读0次

场景

饭店点餐一般有俩种方式,一种是单点,一种是套餐,如果单点我们需要面对菜单上所有的菜,如果有了套餐,我只需要点一个合适的套餐就可以,因为有套餐的存在,所以客户不需要直接对应菜单所有的菜,只与套餐交互即可,整个过程简单省事

单点、套餐

问题来了
在软件开发中,有时候为了完成一项较为复杂的功能,一个客户类需要和多个业务类交互,而这些需要交互的业务类经常会作为一个整体出现,由于涉及到的类比较多,导致使用时代码较为复杂

问题改进
为了避免客户类需要和多个业务类交互,需要一个类似套餐一样的角色,由它来负责和多个业务类进行交互,而客户类只需与该类交互即可

表述 (结构型模式)

为子系统中的一组接口提供一个统一的接口。外观模式定义了一个更高层次的接口,这个接口使得这一子系统更加容易使用

外观模式中,一个子系统的外部与其内部的通信通过一个统一的外观类进行,外观类将客户类与子系统的内部复杂性分隔开,使得客户类只需要与外观角色打交道,而不需要与子系统内部的很多对象打交道。

外观模式类图

外观模式类图
  • Facade(外观角色):就是表述中的“高层接口”,客户端可以调用这个角色的方法;另外,该角色知道相关的子系统的功能和责任
  • SubSystem(子系统角色):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理由外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已

优点

  • 它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易
  • 它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可

缺点

  • 不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性

使用场景

  • 当要为访问一系列复杂的子系统提供一个简单入口时可以使用外观模式
  • 客户端程序与多个子系统之间存在很大的依赖性。引入外观类可以将子系统与客户端解耦,从而提高子系统的独立性和可移植性

示例

class ColdDish {
    func log() {
        print("凉菜")
    }
}

class HotDish {
    func log() {
        print("热菜")
    }
}

class StapleFood {
    func log() {
        print("主食")
    }
}

class MenuPackage {
    
    var coldDish : ColdDish
    var hotDish : HotDish
    var stapleFood : StapleFood
    
    init() {
        self.coldDish = ColdDish()
        self.hotDish = HotDish()
        self.stapleFood = StapleFood()
    }
    
    func eat() {
        self.coldDish.log()
        self.hotDish.log()
        self.stapleFood.log()
    }
}

客户端调用:

let menuPackage = MenuPackage()
menuPackage.eat()

log:
//凉菜
//热菜
//主食

相关文章

  • Android设计模式——外观模式(七大结构型)

    1.外观模式介绍 外观模式(Facade Pattern),是七大结构型设计模式之一。 外观模式运...

  • 设计模式[9]-外观模式-Facade Pattern

    1. 外观模式 外观模式(Facade Pattern),又称为门面模式,是非常常用的结构性设计模式。外观模式使得...

  • java设计模式-外观模式(Facade)

    外观模式,属于结构性模式。属于设计模式里面比较简单的设计模式,本人认为是最简单的设计模式。 所谓外观,就是我们能看...

  • 了解外观模式

    java 设计模式 ------外观模式 Java中一共有23种设计模式,每种设计模式各有特...

  • 设计模式之-4.外观模式

    每看一次设计模式,感觉每一个设计模式看起来是那么简单,对于外观模式我的理解就是外观模式:外观模式,这个名字起得不怎...

  • 设计模式详解——外观模式

    本篇文章介绍一种设计模式——外观模式。本篇文章内容参考《JAVA与模式》之门面模式,外观模式,深入浅出外观模式(二...

  • 外观模式(Facede)

    本文参考自: 《JAVA设计模式》之外观模式(Facade) 1. 作用 外观模式也叫门面模式,门面模式是对象的结...

  • 设计模式---外观模式

    1、外观模式(Facade):也叫门面模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个...

  • 设计模式——外观模式

    阎宏博士的《JAVA与模式》一书中开头是这样描述外观(Facade)模式的:门面模式是对象的结构模式,外部与一个子...

  • 设计模式--外观模式

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

网友评论

      本文标题:设计模式 -- 外观模式

      本文链接:https://www.haomeiwen.com/subject/ektslctx.html