Swift-装饰者模式

装饰者模式以对客户透明的方式动态地给一个对象附加上更多的责任,例如生活中常用的生日蛋糕,可以添加蓝莓,巧克力来装饰,可以动态地给一个对象添加额外的职责.

装饰者模式.jpg

Cake类:

class Cake {
    
    func cakeTypeName() -> String { return "" }
    
    func make() { }

}

class BirthdayCake: Cake {
    
    override func cakeTypeName() -> String {
        return "生日"
    }
    
    override func make() {
        let name = cakeTypeName()
        print("\(name)---蛋糕制作成功")
    }
}

装饰者对象:

class FruitsDecorator: Cake {
    
    var cake:Cake?
    
    convenience init(cake:Cake) {
        self.init()
        self.cake = cake
    }
    
    override func cakeTypeName() -> String {
        return "水果"
    }
    
    override func make() {
        let name = cakeTypeName()
        print("\(name)---蛋糕制作成功")
    }
    
}

class ChocolateDecorator: FruitsDecorator {
    
    convenience init(cake:Cake) {
        self.init()
        self.cake = cake
    }
    
    override func cakeTypeName() -> String {
        let name:String = "巧克力" + self.cake!.cakeTypeName()
        return name
    }
}


class BlueberryDecorator: FruitsDecorator {
    
    convenience init(cake:Cake) {
        self.init()
        self.cake = cake
    }
    
    override func cakeTypeName() -> String {
        let name:String = "蓝莓" + self.cake!.cakeTypeName()
        return name
    }
    
}

测试代码:

let cake:Cake = BirthdayCake()
        cake.make()
        
        let cake2:Cake = ChocolateDecorator(cake: cake)
        cake2.make()
        
        let cake3:Cake = BlueberryDecorator(cake: cake)
        cake3.make()
        
        let cake4:Cake = BlueberryDecorator(cake: cake2)
        cake4.make()
        
        print("FlyElephant")
FlyElephant.png

通过例子中可以看到装饰者和被装饰者有相同的方法,有以下几个有点:
① 装饰者模式在不改变原对象的情况下,为类添加了新的功能.
② 装饰者模式可以通过新增的功能进行排列组合生成不同的类,有很好的扩展性.

装饰者模式最大的缺点会因为过度设计生成各种各样功能相似的小类.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 复杂的奖金计算## 考虑这样一个实际应用:就是如何实现灵活的奖金计算。 奖金计算是相对复杂...
    七寸知架构阅读 4,057评论 4 67
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,982评论 1 15
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,521评论 25 708
  • 已是不惑之年,虚荣心让我多年无法面对自己。出身于一个家庭联产承包责任制的时代的我,父母都是地地道道的最老实朴实的中...
    澳洲太阳鸟阅读 88评论 0 0