1 裝飾模式能夠實現動態的為物件新增功能,是從乙個物件外部來給物件新增功能。通常給物件新增功能,要麼直接修改物件新增相應的功能,要麼派生對應的子類來擴充套件,抑或是使用物件組合的方式。顯然,直接修改對應的類這種方式並不可取。在物件導向的設計中,而我們也應該盡量使用物件組合,而不是物件繼承來擴充套件和復用功能。裝飾器模式就是基於物件組合的方式,可以很靈活的給物件新增所需要的功能。裝飾器模式的本質就是動態組合。動態是手段,組合才是目的。總之,裝飾模式是通過把複雜的功能簡單化,分散化,然後再執行期間,根據需要來動態組合的這樣乙個模式。
2 問題提出:在軟體系統中,有時候我們會使用繼承來擴充套件物件的功能,但是由於繼承為型別引入的靜態特質,使得這種擴充套件方式缺乏靈活性;並且隨著子類的增多(擴充套件功能的增多),各種子類的組合(擴充套件功能的組合)會導致更多子類的膨脹。如何使「物件功能的擴充套件」能夠根據需要來動態地實現?同時避免「擴充套件功能的增多」帶來的子類膨脹問題?
這時我們就可以使用裝飾器模式
同樣的我們還是來舉個例子看看:
設計乙個小遊戲 遊戲中很多的角色(角色包括: 槍手gunmen,刀客swordsman等), 角色擁有**,**包括(刀knife(150),槍gun(200),棍(100)),
遊戲中我們可以通過給**加上一些寶石(藍寶石,紅寶石,綠寶石) 來加強**的攻擊力。
紅寶石每增加一顆 攻擊力 +5;ruby
綠寶石每增加一顆 攻擊力 +20
結構圖:
首先還是先建立兩個介面;
1package
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是裝飾抽象類,為物件增加功能...