美文网首页
装饰模式(Decorator)

装饰模式(Decorator)

作者: 石头老张 | 来源:发表于2018-05-28 15:55 被阅读0次

    定义

    动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。

    抽象结构图

    装饰器模式,抽象结构图

    Component是一个最基础的类(基类或者抽象类),Decorator继承了Component,重写其方法;并且再持有一个Component的对象,重写的方法调用原来对象的方法,之后再添加新功能,即“装饰”功能。

    Component类

    abstract class Component {
        abstract fun operation()  
    }
    

    ConcreteComponent

    class ConcreteComponent : Component() {
        override fun operation() {
            // do sth.
        }
    }
    

    Decorator类

    open class Decorator : Component() {
    
        protected var component: Component? = null
    
        override fun operation() {
            component?.operation()
        }
    
        fun setComponent(com: Component) {
            this.component = com
        }
    
    }
    

    ConcreteDecoratorA类

    class ConcreteDecoratorA : Decorator() {
        
        private var addedState: String? = null
    
        override fun operation() {
            super.operation()
            addedState = "New State!"
        }
    
    }
    

    ConcreteDecoratorB类

    class ConcreteDecoratorB : Decorator() {
    
        override fun operation() {
            super.operation()
            addBehavior()
        }
    
        private fun addBehavior() {
            // do sth.
        }
    
    }
    

    调用装饰器

    fun initNewComponent() {
        val concreteComponent: ConcreteComponent = ConcreteComponent()
        val concreteDecoratorA: ConcreteDecoratorA = ConcreteDecoratorA()
        val concreteDecoratorB: ConcreteDecoratorB = ConcreteDecoratorB()
    
        concreteDecoratorA.component = concreteComponent
        concreteDecoratorB.component = concreteDecoratorA
        concreteDecoratorB.operation()
    }
    

    简单应用例子

    人穿衣服,实际上衣服是对人的一个装饰。不同职业各具特色,以程序猿为例:

    open class Person {
    
        open fun show() {
            // 展示外貌
        }
    
    }
    

    一个Person的类,具有一个基本show方法,用于展示外貌。

    class ProgrammerClothing : Person() {
    
        val person: Person? = null
    
        override fun show() {
            person?.show()
            addShirt()
            addShorts()
            addSlipper()
        }
    
        private fun addShirt() {
            // 穿上衬衫
        }
    
        private fun addShorts() {
            // 穿上短裤
        }
    
        private fun addSlipper() {
            // 穿上拖鞋
        }
    
    }
    

    ProgrammerClothing是person的装饰器,给person穿上衬衣、短裤和拖鞋。

    fun showProgrammerCostum() {
        val person: Person = Person()
        val programmerClothing: ProgrammerClothing = ProgrammerClothing()
        programmerClothing.person = person
        programmerClothing.show()
    }
    

    启用装饰方法,将person实例放入programmerClothing中进行装饰,这样show出来的,就是一个程序猿形象啦。

    总结

    • 装饰器模式,可以给已有的类动态添加更多功能;
    • 不改变旧类的实现逻辑,只在新类中添加代码,新增的装饰器只在特定的情况下调用,风险很低;
    • 有效的把类的核心职责和装饰功能分开。

    相关文章

      网友评论

          本文标题:装饰模式(Decorator)

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