装饰模式

2017-03-03  本文已影响11人  冰冰大象

定义

在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象

装饰模式的特点

  1. 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互
  2. 装饰对象包含一个真实对象的引用(reference)
  3. 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象
  4. 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

场景:更具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())")
上一篇下一篇

猜你喜欢

热点阅读