1. 程式人生 > 其它 >結構性:三. 裝飾器模式

結構性:三. 裝飾器模式

裝飾器模式是什麼

是一種結構型設計模式,它允許你將物件放入包含行為的特殊封裝物件中來為原物件繫結新的行為。由於目標物件和裝飾器遵循同一介面,所以你可以對目標進行多次裝飾,最後結果為所有裝飾器疊加的行為。

為什麼用裝飾器模式

需要動態的給一個物件增加功能,並且可以動態的撤銷的時候。當系統需要新增新的功能是向主類新增新的欄位方法或者邏輯,而新的東西只在某些特殊的情況下才會執行。這個時候裝飾模式提供了很好的解決方案。裝飾模式把需要新增的功能放在單獨的類中,並讓這個類包裹它所要裝飾的物件。這樣就可以在需要是,有選擇的按順序的使用包裝功能包裝物件。

裝飾器模式怎麼實現

這裡我們的目標物件ConcreteComponent有一個Calc方法。然後MulDecorator和AddDecorator兩個裝飾器分別來擴充套件目標物件的功能。

目標
package decorator


type Component interface {
    Calc()int
}

type ConcreteComponent struct{}

func (c *ConcreteComponent) Calc() int {
    return 0
}

MulDecorator裝飾器
type MulDecorator struct {
    Component
    num int
}

func WarpMulDecorator(c Component, num int) Component {
    return &MulDecorator{
        Component: c,
        num:       num,
    }
}

func (d *MulDecorator) Calc() int {
    return d.Component.Calc() * d.num
}


AddDecorator裝飾器
type AddDecorator struct {
    Component
    num int
}

func WarpAddDecorator(c Component, num int) Component {
    return &AddDecorator{
        Component: c,
        num:       num,
    }
}

func (d *AddDecorator) Calc() int {
    return d.Component.Calc() + d.num
}

優點

  1. 裝飾器是繼承有力的補充,在不改變原有物件的情況下動態的給物件擴充套件功能。
  2. 裝飾器模式完全準守開閉原則。

缺點

  1. 裝飾器模式會增加更多的類和程式碼,增加程式的複雜性。