結合了一些百度百科的概念然後使用代碼進行理解~
裝飾者模式:
指的是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
使用場景:
- 需要擴展一個類的功能,或給一個類添加附加職責。
- 需要動態的給一個對象添加功能,這些功能可以再動態的撤銷。
- 需要增加由一些基本功能的排列組合而產生的非常大量的功能,從而使繼承關係變的不現實。
- 當不能採用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,爲支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因爲類定義被隱藏,或類定義不能用於生成子類。
這裏針對第四種情況給出案例代碼,以後碰到了會補充~
在這個案例代碼中,我們假設不知道Waitress的具體實現,要擴展,可是不能使用繼承父類的方式,所以自己定義一個WaitressWrap實現Waiter接口。
Waiter.java
package wraper;
public interface Waiter {
void service();
}
Waitress.java
package wraper;
public class Waitress implements Waiter {
@Override
public void service() {
System.out.println("hello waiter");
}
}
WaitressWrap.java
package wraper;
public class WaitressWrap implements Waiter{
Waiter waiter=null;
public WaitressWrap(Waiter waiter){
this.waiter=waiter;
}
@Override
public void service() {
System.out.println("hello waiter+2");
waiter.service();
}
}
Test.java
package wraper;
public class Test {
public static void main(String[] args){
/*
Waiter wa=new Waitress();
wa.service();
*/
WaitressWrap ww=new WaitressWrap(new Waitress());
ww.service();
}
}