定義
動態(tài)地給一個(gè)對象添加一些額外的職責(zé),就增加功能來說卜高,裝飾模式比生成子類更加靈活。
抽象結(jié)構(gòu)圖
Component是一個(gè)最基礎(chǔ)的類(基類或者抽象類)候址,Decorator繼承了Component,重寫其方法种柑;并且再持有一個(gè)Component的對象岗仑,重寫的方法調(diào)用原來對象的方法,之后再添加新功能聚请,即“裝飾”功能荠雕。
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.
}
}
調(diào)用裝飾器
fun initNewComponent() {
val concreteComponent: ConcreteComponent = ConcreteComponent()
val concreteDecoratorA: ConcreteDecoratorA = ConcreteDecoratorA()
val concreteDecoratorB: ConcreteDecoratorB = ConcreteDecoratorB()
concreteDecoratorA.component = concreteComponent
concreteDecoratorB.component = concreteDecoratorA
concreteDecoratorB.operation()
}
簡單應(yīng)用例子
人穿衣服稳其,實(shí)際上衣服是對人的一個(gè)裝飾。不同職業(yè)各具特色炸卑,以程序猿為例:
open class Person {
open fun show() {
// 展示外貌
}
}
一個(gè)Person的類既鞠,具有一個(gè)基本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實(shí)例放入programmerClothing中進(jìn)行裝飾,這樣show出來的疙驾,就是一個(gè)程序猿形象啦凶伙。
總結(jié)
- 裝飾器模式,可以給已有的類動態(tài)添加更多功能它碎;
- 不改變舊類的實(shí)現(xiàn)邏輯函荣,只在新類中添加代碼,新增的裝飾器只在特定的情況下調(diào)用链韭,風(fēng)險(xiǎn)很低偏竟;
- 有效的把類的核心職責(zé)和裝飾功能分開。