美文网首页
装饰模式

装饰模式

作者: 冰冰大象 | 来源:发表于2017-03-03 17:01 被阅读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())")

    相关文章

      网友评论

          本文标题:装饰模式

          本文链接:https://www.haomeiwen.com/subject/qielgttx.html