当前位置:网站首页>装饰器模式: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)
边栏推荐
- 1036 Programming with Obama (15 points)
- opengauss创建用户权限问题
- 1091 N-自守数 (15 分)
- 【415. 字符串相加】
- 2021-08-11 for循环结合多线程异步查询并收集结果
- TF generates (feature, label) set through feature and label, tf.data.Dataset.from_tensor_slices
- 项目1-PM2.5预测
- Keep track of your monthly income and expenses through bookkeeping
- TF通过feature与label生成(特征,标签)集合,tf.data.Dataset.from_tensor_slices
- 基于微信小程序的租房小程序
猜你喜欢
随机推荐
项目2-年收入判断
【Day_13 0509】▲跳石板
Project 1 - PM2.5 Forecast
Keep track of your monthly income and expenses through bookkeeping
零基础SQL教程: 主键、外键和索引 04
TF通过feature与label生成(特征,标签)集合,tf.data.Dataset.from_tensor_slices
初级软件测试工程师笔试试题,你知道答案吗?
关于Android Service服务的面试题
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
Mysql JSON对象和JSON数组查询
1003 I want to pass (20 points)
【云原生】云原生在网络安全领域的应用
3.2-分类-Logistic回归
go-grpc TSL authentication solution transport: authentication handshake failed: x509 certificate relies on ... ...
Redis source code: how to view the Redis source code, the order of viewing the Redis source code, the sequence of the source code from the external data structure of Redis to the internal data structu
Evolution and New Choice of Streaming Structured Data Computing Language
1106 2019数列 (15 分)
TF中使用softmax函数;
机器学习(一)数据的预处理
1076 Wifi Password (15 points)