iOS设计模式-装饰器

概念

装饰器模式是一种结构型设计模式 ,它允许你在不修改原有类的情况下,通过"包裹"的方式动态地为对象添加新功能。与继承不同,它在运行时灵活组合,符合开闭原则(对扩展开放,对修改关闭)。

适用场景

适用于 在基本功能基础上,进行功能叠加场景。

角色

协议:行为抽象

功能组件:遵守协议,实现基础功能

装饰器基类:遵守协议,持有功能组件,调用转发

装饰器扩展:继承自装饰器基类,通过重载,进行行为扩展(功能叠加)

示例:咖啡配料系统

  • 定义协议
scss 复制代码
protocol Coffee {
    func description() -> String
    func cost() -> Double
}
  • 功能组件,遵守协议。

实现基本功能。

csharp 复制代码
class PlainCoffee: Coffee {
    func description() -> String { "简单咖啡" }
    func cost() -> Double { 10.0 }
}
  • 基础装饰器(持有引用功能组件,同时也遵守协议,转发调用)

作为基类

swift 复制代码
class CoffeeDecorator: Coffee {

    private let decoratedCoffee: Coffee

    init(_ coffee: Coffee) {
        self.decoratedCoffee = coffee
    }

    // 协议调用 转发
    func description() -> String {
        decoratedCoffee.description()
    }

    func cost() -> Double {
        decoratedCoffee.cost()
    }
}
  • 具体装饰器(扩展行为)

继承自 基础装饰器,重载;

职责单一: 每个装饰器只做一件事,(每种功能分开写在一个子类中

swift 复制代码
class MilkDecorator: CoffeeDecorator {
    override func description() -> String {
        super.description() + ",加牛奶"
    }
    override func cost() -> Double {
        super.cost() + 5.0
    }
}

class SugarDecorator: CoffeeDecorator {
    override func description() -> String {
        super.description() + ",加糖"
    }
    override func cost() -> Double {
        super.cost() + 3.0
    }
}

class VanillaDecorator: CoffeeDecorator {
    override func description() -> String {
        super.description() + ",香草风味"
    }
    override func cost() -> Double {
        super.cost() + 8.0
    }
}
  • 灵活组合

功能一层一层加

scss 复制代码
let plain = PlainCoffee()
print(plain.description()) // 简单咖啡
print(plain.cost())        // 10.0

// 组合 叠加
let milkCoffee = MilkDecorator(plain)
let sugerCoffee = SugarDecorator(milkCoffee)
let fancyCoffee = VanillaDecorator(sugerCoffee)

print(fancyCoffee.description())
// 简单咖啡,加牛奶,加糖,香草风味

print(fancyCoffee.cost())
// 26.0(10 + 5 + 3 + 8)
  • 可扩展性:

需要加其他功能?只需再写一个对应的装饰器,插入链中,其他代码零修改。

相关推荐
恋猫de小郭39 分钟前
Redis 作者反驳「中国模型之所以强,是因为通过 API 蒸馏了美国模型」
前端·人工智能·ai编程
Darling噜啦啦43 分钟前
Canvas 游戏开发与数据可视化实战:从飞机大战到 ECharts 报表
前端·echarts·canvas
OpenTiny社区1 小时前
这次更新太良心!GenUI SDK v1.2.0 轻量化 + 稳流式 + 超强 Playground
前端·vue.js·ai编程
梨子同志1 小时前
WebGL test
前端
程序员黑豆1 小时前
AI全栈开发系列开篇:从Java全栈到AI应用实战
前端·ai编程·全栈
yangyj1 小时前
从 PDR 到落地:用 Codex 完成一次 Rspack 升级
前端
程序员鱼皮1 小时前
提示词工程已死,Loop Engineering 称王!保姆级教程 + 项目实战
前端·后端·ai编程
小爷毛毛_卓寿杰1 小时前
给 Embedding 模型也加一块“游乐场“—— Xinference 是怎么把 vector 变成肉眼可见的体验的
前端
忆江南1 小时前
iOS 性能优化全面详解
前端
lichenyang4531 小时前
HAP / HAR / HSP 到底啥区别?顺带把「导入」那点疑惑讲清楚
前端