当前位置:网站首页>装饰器模式: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)
边栏推荐
- 2.1-梯度下降
- oracle19c does not support real-time synchronization parameters, do you guys have any good solutions?
- Write a resume like this, easy to get the interviewer
- 租房小程序
- 1.1-回归
- [Recommender System]: Overview of Collaborative Filtering and Content-Based Filtering
- Four operations in TF
- C语言-结构体
- 1106 2019数列 (15 分)
- 1096 big beautiful numbers (15 points)
猜你喜欢
随机推荐
我的创作纪念日丨感恩这365天来有你相伴,不忘初心,各自精彩
Dynamic Agent Learning
关于Android Service服务的面试题
无服务器+域名也能搭建个人博客?真的,而且很快
Project 1 - PM2.5 Forecast
Mysql JSON对象和JSON数组查询
Distributed Lock-Redission - Cache Consistency Solution
1.2-误差来源
【Day_13 0509】▲跳石板
1046 punches (15 points)
1036 跟奥巴马一起编程 (15 分)
1071 小赌怡情 (15 分)
C语言操作符详解
1051 复数乘法 (15 分)
Two state forms of Service
初级软件测试工程师笔试试题,你知道答案吗?
Tensorflow中使用tf.argmax返回张量沿指定维度最大值的索引
JRS303-数据校验
囍楽cloud task source code
抽象类和接口






