裝飾器(Decorator)模式

2021-09-22 13:42:54 字數 2639 閱讀 1310

1  裝飾模式能夠實現動態的為物件新增功能,是從乙個物件外部來給物件新增功能。通常給物件新增功能,要麼直接修改物件新增相應的功能,要麼派生對應的子類來擴充套件,抑或是使用物件組合的方式。顯然,直接修改對應的類這種方式並不可取。在物件導向的設計中,而我們也應該盡量使用物件組合,而不是物件繼承來擴充套件和復用功能。裝飾器模式就是基於物件組合的方式,可以很靈活的給物件新增所需要的功能。裝飾器模式的本質就是動態組合。動態是手段,組合才是目的。總之,裝飾模式是通過把複雜的功能簡單化,分散化,然後再執行期間,根據需要來動態組合的這樣乙個模式。

2  問題提出:在軟體系統中,有時候我們會使用繼承來擴充套件物件的功能,但是由於繼承為型別引入的靜態特質,使得這種擴充套件方式缺乏靈活性;並且隨著子類的增多(擴充套件功能的增多),各種子類的組合(擴充套件功能的組合)會導致更多子類的膨脹。如何使「物件功能的擴充套件」能夠根據需要來動態地實現?同時避免「擴充套件功能的增多」帶來的子類膨脹問題?

這時我們就可以使用裝飾器模式

同樣的我們還是來舉個例子看看:

設計乙個小遊戲 遊戲中很多的角色(角色包括: 槍手gunmen,刀客swordsman等), 角色擁有**,**包括(刀knife(150),槍gun(200),棍(100)),

遊戲中我們可以通過給**加上一些寶石(藍寶石,紅寶石,綠寶石) 來加強**的攻擊力。

紅寶石每增加一顆 攻擊力 +5;ruby

綠寶石每增加一顆 攻擊力 +20

結構圖:

首先還是先建立兩個介面;

1

package

ooad.design.decorator;23

public

inte***ce

iweapon

1

package

ooad.design.decorator;23

public

inte***ce

irole

接著我們建立**:

1

package

ooad.design.decorator;23

public

class gun implements

iweapon

1112

@override

13public

string getname()

1718

@override

19public

intgetattack()

2324

2526 }

然後我們建立角色:

1

package

ooad.design.decorator;23

public

class gunmen implements

irole

11public

string getname()

1415

16public

void

setname(string name)

1920

21@override

22public

void

attack(iweapon weapon)

2526 }

因為**需要寶石來裝飾,所以呢我們建立乙個裝飾的抽象類

1

package

ooad.design.decorator;23

public

abstract

class decorator implements

iweapon

寶石類:

1

package

ooad.design.decorator;23

public

class ruby extends

decorator

1011

@override

12public

string getname()

1617

@override

18public

intgetattack()

2223 }

來個測試:

1

package

ooad.design.decorator;23

public

class

test

1213 }

最終結果:

槍手使用火箭槍進行攻擊,造成的傷害值為:200

槍手使用增加了紅寶石的火箭槍進行攻擊,造成的傷害值為:205

如果想要用兩顆紅寶石我們就可以這樣:

r.attack(w);

r.attack(w);

結果呢則是:

槍手使用火箭槍進行攻擊,造成的傷害值為:200

槍手使用增加了紅寶石的增加了紅寶石的火箭槍進行攻擊,造成的傷害值為:210

增加了紅寶石的增加了紅寶石的  這樣看起來不舒服吧,該怎樣去判斷他到底增加了幾顆寶石,我們就顯示幾顆寶石呢?

例子中的角色,**,裝飾的寶石,我就沒有全部寫出來了!

裝飾器模式 decorator

所有的說明和解釋都在 中有注釋來標明 package mode.decorator 這裡定義乙個介面,在介面中定義我們要執行的操作。以後所有的裝飾器以及我們要裝飾的物件都要實現這個介面。有了這樣的大前提,我們就可以其用 sourcable來定義我們的裝飾器和要裝飾的物件了 public inte c...

裝飾器模式 Decorator

設計原則 1 類應該對擴充套件開發,對修改關閉。特點 1 裝飾物件和真實物件有相同的介面。這樣客戶端物件就可以以和真實物件相同的方式和裝飾物件互動。2 裝飾物件包含乙個真實物件的引用 reference 3 裝飾物件接收所有來自客戶端的請求,它把這些請求 給真實的物件。4 裝飾物件可以在 這些請求之...

裝飾器模式(Decorator)

裝飾器模式的作用 動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾器模式比生成子類更加靈活。裝飾器模式結構圖 各個類或介面的職能 component是定義乙個物件介面,可以給這些物件增加功能。concretecomponent定義乙個具體的物件。decorator是裝飾抽象類,為物件增加功能...