装饰模式

定义

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

装饰模式的特点

  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())")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 概述 demo地址,欢迎star 2. 问题 3. 解决方案 装饰器模式: 动态地给一个对象添加一些额外的...
    barry阅读 275评论 0 0
  • (转载)原文地址 在阎宏博士的《JAVA与模式》一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又...
    zjk_00阅读 651评论 0 2
  • 1. 何为装饰模式 1.1 定义: 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一...
    LeeLeCoder阅读 273评论 0 0
  • 小学的时候,写过一篇作文,叫做《我长大后想成为…》,很多人说想成为科学家、宇航员或者画家。我想成为一名记者或者是作...
    一池南风阅读 443评论 0 5
  • Memory is after all memory, I can't return to my younger ...
    人与海阅读 392评论 0 0