装饰模式
2017-03-03 本文已影响11人
冰冰大象
定义
在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象
装饰模式的特点
- 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互
- 装饰对象包含一个真实对象的引用(reference)
- 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象
- 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
场景:更具Coder的技能 分发工资,会的技能越多发的工资当然也就越多
接口
protocol ICoder {
//技能
func skill()
//工资
func pay()-> Int
}
对象(重点必须继承统一接口ICoder)
//程序员
class Coder: ICoder {
init(owner: String) {
print("我是\(owner)")
}
func skill() {
}
func pay()-> Int {
return 2000
}
}
装饰器
//装饰器 装饰对象和真实对象有相同的接口ICoder
class Decorator_Coder: ICoder {
var coder: ICoder?
func pay() -> Int {
return coder?.pay() ?? 0
}
func skill() {
coder?.skill()
}
func decorator(_ coder: ICoder) -> ICoder {
//装饰对象包含一个真实对象的引用
self.coder = coder
return self
}
}
装饰对象
// 装饰器对象
class swift: Decorator_Coder {
override func pay() -> Int {
return super.pay() + 1000
}
override func skill() {
super.skill()
//装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
print("我会swift")
}
}
class weekx: Decorator_Coder {
override func pay() -> Int {
return super.pay() + 1000
}
override func skill() {
super.skill()
print("我会weekx")
}
}
class donet: Decorator_Coder {
override func pay() -> Int {
return super.pay() + 1000
}
override func skill() {
super.skill()
print("我会donet")
}
}
真实对象开始装饰
var LMD:ICoder=Coder(owner:"李美东")
//装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象
LMD = swift().decorator(LMD)
LMD = weekx().decorator(LMD)
print("工资:\(LMD.pay())")
var WZZ:ICoder=Coder(owner:"王增站")
WZZ = swift().decorator(WZZ)
print("工资:\(WZZ.pay())")
var WT:ICoder=Coder(owner:"王腾")
WT = swift().decorator(WT)
WT = donet().decorator(WT)
print("工资:\(WT.pay())")