裝飾模式的定義:動態地給乙個物件新增額外的職責,就新增功能來說,裝飾模式比生成子類更加靈活。
這段話比較抽象,自己根據裝飾模式實踐了一下,有了一些小小的領悟分享一下。
我們最開始有一抽象類,比如說是人,它有兩個子類分別是學生和老師,並且有一些共有的屬性放在抽象類「人」中,有一些獨有的屬性放在各自的學生類和老師類中。並且有乙個虛函式要學生和老師類來實現。
這模擬的是我們已經有乙個生態系統了。
person類:
public
abstract
class person
student類:
public
class
student
extends
person
@override
public
void
show()
}
teacher類:
public
class
teacher
extends
person
@override
public
void
show()
}
現在我們需要向person新增乙個功能,給每個人穿衣服並且顯示每個人的穿著。
在person類中新增乙個虛函式,再在各個類中實現穿衣這個穿衣函式,但是這種方法即難以實現又違背了開閉原則,因為會去更改每個類。
裝飾模式提供了一種很好的解決方案:
定義乙個介面,我的理解是定義乙個需要新增的功能的介面,比如此種情況,我們定義乙個dress介面:
public
inte***ce dress
然後先對這個介面編寫各種衣服的類,所以先抽象出來乙個衣物類finary,它實現了介面。finary的建構函式很重要,它指定需要裝飾哪個物件的dress介面
public
class
finery
implements
dress
@override
public
void
dressing()
}}
然後建立各項衣物類finary的子模擬如tshirt、suit、tie。。。類
public
class
tshirt
extends
finery
@override
public
void
dressing()
}
public
class
wearsuit
extends
finery
@override
public
void
dressing()
}
public
class
weartie
extends
finery
@override
public
void
dressing()
}
然後是person針對介面程式設計,因為每個人都需要穿衣服,並且都需要穿內衣……
public
abstract
class
person
implements
dress
public
abstract
void
show();
}
對於student和teacher類這裡不需要重寫dressing(),這是裝飾模式最重要的應用點!!!即不需要修改已經例項化的person子類,只需要抽象類person針對介面程式設計,符合開閉原則,完美啊!!!
最後來看下是怎麼呼叫的:
public
static
void
main(string args)
我們new乙個student的時候,不僅例項化了乙個學生物件,並且也實現了乙個dress介面,原來student的內容不需要改,要給每個學生穿衣服只需要將person的dress介面提取出來:
dress studentdress =person;
然後對person的dress介面「穿衣服」就行了!!!
此處就是對例項化了的stduent的dress介面studentdress進行「穿衣服」:
studentdress = new tshirt(studentdress);
studentdress = new bigtrousers(studentdress);
studentdress.dressing();
輸出結果:
student peter's age is 15 in grade 2
dressing: underwear
dressing: tshirt
dressing: bigtrousers
teacher jobey's age is
35dressing: underwear
dressing: wearsuit
dressing: weartie
studentdress.dressing();
首先呼叫的是person實現的dressing(),我的理解是畢竟這是new person才建立的介面嘛,之後是按「穿衣」順序來呼叫dressing()函式。 《設計模式》學習筆記 裝飾模式
裝飾模式 decorator pattern 指的是在不必改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能.它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。pragma once include includeclass car class runcar public car pr...
裝飾器模式學習筆記
參考鏈結1 參考鏈結2 裝飾器模式 在不改變原類和不生成子類的情況下,動態為物件新增額外的職責。其比繼承更靈活 更具彈性。不改變原類擴充套件功能,符合開閉原則 對修改關閉,對新增開放 不通過子類擴充套件功能,可以讓類設計更靈活。因為繼承實現子類行為,編譯是靜態的 而用組合擴充套件功能,則可以在程式執...
設計模式學習筆記之裝飾模式
裝飾模式 包裝器 動態地給物件新增一些額外的職責。即動態擴充套件乙個物件的功能,而不需要改變原始類 具體元件 類和 具體裝飾 類是該模式最重要的兩個角色 抽象元件 author zhenyonghe eg.假設系統中有乙個bird抽象類以及bird類的乙個子類 sparrow。sparrow類實現了...