代碼
package cn.test;
public class Test {
public static void main(String[] args) {
OldPerson oldPerson = new OldPerson(new YoungPerson());
oldPerson.eat();
}
}
class YoungPerson{
public void eat(){
System.out.println("吃飯");
}
}
class OldPerson{
private YoungPerson youngPerson;
public OldPerson(YoungPerson youngPerson) {
this.youngPerson = youngPerson;
}
public void eat(){
System.out.println("飯錢(qián)來(lái)跟煙");
this.youngPerson.eat();
System.out.println("飯后來(lái)點(diǎn)甜品");
}
}
總結(jié)
- 當(dāng)需要給一個(gè)現(xiàn)有類(lèi)添加附加職責(zé),而又不能采用生成子類(lèi)的方法進(jìn)行擴(kuò)充時(shí)例如該類(lèi)被隱藏,或者該類(lèi)是終極類(lèi),或者采用繼承方式會(huì)產(chǎn)生大量的子類(lèi).
- 當(dāng)需要通過(guò)對(duì)現(xiàn)有的一組基本功能進(jìn)行排列組合而產(chǎn)生非常多的功能時(shí)耀销,采用繼承關(guān)系很難實(shí)現(xiàn)缰贝,而采用裝飾模式卻很好實(shí)現(xiàn).
- 當(dāng)對(duì)象的功能要求可以動(dòng)態(tài)地添加戳气,也可以再動(dòng)態(tài)地撤銷(xiāo)時(shí).
上述的情況都可以用裝飾模式.