聊聊Swift中的设计模式---结构型(装饰器模式)

721 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情


前言

在面向对象的开发过程中,其实咱们或多或少的都接触过一些设计模式,可能知道或不知道其对应的名称,也不知道其具体使用场景,今天咱们就来说说几种常见的设计模式,帮助你们在开发过程中,更加得心应手。

正文

装饰器模式

装饰模式是一种结构型设计模式, 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。

用简单的话说就是,给一个人,穿上泳衣,他就可以去游泳、给他穿上篮球衣,就可以去打篮球、穿上滑雪服,就可以去滑雪。而这些衣服,就可以理解为装饰器,有了装饰器,这个人就可以去干特定的事情。这些衣服只是扩展了你的行为,但它们并不是你的一部分。

有了上面这段话的理解,咱们再来看下面的例子,应该就比较好理解了。

先看图例:

截屏2022-06-13 上午10.38.53.png

例子

首先,定义一个Shape协议,接下来,咱们要给这个Shape,添加装饰,让它更适合输出

protocol Shape {
    func draw()
}

这里定义两个类,都继承自Shape,并在内部实现draw()方法。


class Rectangle: Shape {
    func draw() {
        print("形状: 矩形")
    }
}

class Circle: Shape {
    func draw() {
        print("形状:圆")
    }
}

然后定义一个Shape的装饰器ShapeDecorator继承自Shape,在里面定义了一个decoratedShape的实例对象,初始化ShapeDecorator时,将Shape类的对象传入,赋值给decoratedShape,这样,decoratedShape就可以调用draw()方法实现输出。


class ShapeDecorator: Shape {
    let decoratedShape: Shape

    init(shape: Shape) {
        self.decoratedShape = shape
    }

    func draw() {
        decoratedShape.draw()
    }
}

创建一个RedShapeDecorator继承自ShapeDecorator,在内部重写draw()并添加自己的方法 setRedBorder(),这样,RedShapeDecorator的实例调用draw()方法时,就可以同时实现父类的方法(draw())和自己的方法(setRedBorder())了。


class RedShapeDecorator: ShapeDecorator {
    override func draw() {
        super.draw()
        setRedBorder()
    }

    func setRedBorder() {
        print("边框的颜色:红色")
    }
}

最后,咱们来看效果如何

let cirle = Circle()

let redCircle = RedShapeDecorator(shape: Circle())
let redRectangle = RedShapeDecorator(shape: Rectangle())

print("无边框的圆")
cirle.draw()

print("\n红色边框的圆")
redCircle.draw()

print("\n红色边框的矩形")
redRectangle.draw()

输出

无边框的圆
形状:圆

红色边框的圆
形状:圆
边框的颜色:红色

红色边框的矩形
形状: 矩形
边框的颜色:红色

结语

什么时候可以使用

  • 如果你希望在无需修改代码的情况下即可使用对象, 且希望在运行时为对象新增额外的行为, 可以使用装饰模式。
  • 如果用继承来扩展对象行为的方案难以实现或者根本不可行, 你可以使用该模式。
  • 单一职责原则。 你可以将实现了许多不同行为的一个大类拆分为多个较小的类。

扩展阅读 下面还有其他模式

创建型-工厂模式

创建型-建造者模式

结构型-适配器模式

结构型-桥接模式

结构型-组合模式