设计模式 -- 外观模式

2019-07-26  本文已影响0人  皆为序幕_

场景

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

单点、套餐

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

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

表述 (结构型模式)

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

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

外观模式类图

外观模式类图

优点

缺点

使用场景

示例

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:
//凉菜
//热菜
//主食
上一篇下一篇

猜你喜欢

热点阅读