装饰模式(Decorator)
2018-05-28 本文已影响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出来的,就是一个程序猿形象啦。
总结
- 装饰器模式,可以给已有的类动态添加更多功能;
- 不改变旧类的实现逻辑,只在新类中添加代码,新增的装饰器只在特定的情况下调用,风险很低;
- 有效的把类的核心职责和装饰功能分开。