当前位置:网站首页>装饰器模式: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)
边栏推荐
猜你喜欢
随机推荐
通过记账,了解当月收支情况
Four states of Activity
Use tf.argmax in Tensorflow to return the index of the maximum value of the tensor along the specified dimension
1002 写出这个数 (20 分)
oracle19c不支持实时同步参数,请教一下大佬们有什么好的解决办法吗?
My creative anniversary丨Thank you for being with you for these 365 days, not forgetting the original intention, and each is wonderful
【LeetCode】Summary of linked list problems
tf.cast(),reduce_min(),reduce_max()
1.1-回归
经典论文-MobileNet V1论文及实践
Two state forms of Service
分布式锁-Redission - 缓存一致性解决
Redis source code-String: Redis String command, Redis String storage principle, three encoding types of Redis string, Redis String SDS source code analysis, Redis String application scenarios
【LeetCode】链表题解汇总
Analysys and the Alliance of Small and Medium Banks jointly released the Hainan Digital Economy Index, so stay tuned!
Kaldi语音识别工具编译问题记录(踩坑记录)
选择收银系统主要看哪些方面?
1003 我要通过 (20 分)
tf.reduce_mean() and tf.reduce_sum()
1091 N-自守数 (15 分)