当前位置:网站首页>装饰器模式:Swift 实现

装饰器模式:Swift 实现

2022-08-11 07:44:00 大头鑫

装饰器 Decorator

The components and decorators are departed, we can add new components and decorators freely. And we can make different compositions(with different decorations) to be different products.
组件模块和装饰器是分开的,我们可以自由地添加组件和装饰器。我们也可使用不同的组合形式(基于不同装饰方式),来得到不同的产品。

在这里插入图片描述

// Base interface between classes.
protocol Component {
    
    var text: String? {
     get set}
    func execute()
}

// Concrete Component
class Bike: Component {
    
    var text: String?
    func execute() {
    
        text = "bike"
    }
}

// Concrete Component
class Moto: Component {
    
    var text: String?

    func execute() {
    
        text = "moto"
    }
}

// Base Decorator
class BaseDecorator: Component {
    
    var text: String?
    
    private var c: Component
    func execute() {
    
        c.execute()
        
        if let t = c.text {
    
            text = "<" + t + ">"   // Here the text is the property of the current concrete decorator.
        } else {
    
            text = "<>"
        }
    }    
    
    func getText() -> String {
    
        if let s = text {
    
            return s
        } else {
    
            return ""
        }
    }
    func setText(_ str: String?) {
    
        text = str
    }
    func getC() -> Component {
    
        return c
    }
    // inject an instance
    init(_ c: Component) {
    
        self.c = c
    }
    
}

// Concrete Decorator
class PaintDecorator: BaseDecorator {
    
    override func execute() {
    
        super.execute()
        extra()
    }
    func extra() {
    
        let s = getText()
        setText("(Paint)\(s)(Paint)")
    }
}

// Concrete Decorator
class AttachTagDecorator: BaseDecorator {
    
    override func execute() {
    
        super.execute()
        extra()
    }
    func extra() {
    
        let s = getText()
        setText("(Tag)\(s)(Tag)")
    }
}

let a = Bike()
let tag = AttachTagDecorator(a)
let paint = PaintDecorator(tag)

paint.execute()                // (Paint)<(Tag)<bike>(Tag)>(Paint)
print(paint.getText())

let b = Moto()
let bpaint = PaintDecorator(b)
let bTag = AttachTagDecorator(bpaint)
bTag.execute()                // (Tag)<(Paint)<moto>(Paint)>(Tag)
print(bTag.getText())

上面代码中,组件有 Bike 和 Moto,装饰器有 AttachTagDecorator 和 PaintDecorator。对 Bike 先贴标签再绘图,而对 Moto 是先画图再贴标签,获得的结果中可以看出两个组件被包装的方式不一样。

// (Paint)<(Tag)<bike>(Tag)>(Paint)
// (Tag)<(Paint)<moto>(Paint)>(Tag)
原网站

版权声明
本文为[大头鑫]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_39147809/article/details/126260835