裝飾設(shè)計模式
就是對類本身的功能進行了增強。
其實我們曾經(jīng)還學(xué)過一個東西,也可以對類的功能進行增強。
繼承。
對手機進行功能的擴展。
繼承:
定義一個基本的手機類:
Phone.java
我喜歡在接電話之前,聽會鈴聲。
請問怎么實現(xiàn)。
重寫定義一個手機類,繼承以前的手機。只不過擴展了聽彩鈴的功能。
MusicPhone.java
隨著需求的發(fā)展,我的要求又改變了,我喜歡的手機是在打完電話后,可以聽廣告的。
AdPhone.java
我的要求又提高了,我想在打電話前聽彩鈴,打電話后聽廣告。
a:繼承Phone類,自己在打電話前提供聽彩鈴功能,打電話后聽廣告功能。
b:繼承MusicPhone類,只添加聽廣告功能。
c:繼承AdPhone類,只添加聽彩鈴功能。
隨著我的需求,越來越多,我們會發(fā)現(xiàn),這個繼承結(jié)構(gòu)也越來越龐大。
繼承結(jié)構(gòu)越判斷,將來的靈活性越差。
裝飾設(shè)計模式的組成:
接口
對接口的具體實現(xiàn)
抽象裝飾類
具體裝飾類
實例:
定義一個接口:定義的是那個被裝飾的抽象的東西
Phone.java
定義一個具體的事物類:
PhoneImpl.java
定義一個抽象的裝飾類:
PhoneDecorate.java
具體的裝飾類:
鈴聲裝飾類:MusicPhoneDecorate.java
廣告裝飾類:AdPhoneDecorate.java
鈴聲和廣告裝飾類:錯誤。不用提供。
定義一個Phone接口
public interface Phone {
public abstract void call();
}
定義一個PhoneImpl具體實例
public class PhoneImpl implements Phone {
@Override
public void call() {
System.out.println("手機可以打電話");
}
}
定義一個PhoneDecorate抽象的裝飾類
public abstract class PhoneDecorate implements Phone {
private Phone p;
public PhoneDecorate(Phone p) { // new PhoneImp(); new PhoneImpl2();
this.p = p;
}
@Override
public void call() {
this.p.call();
}
}
定義一個MusicPhoneDecorate具體的裝飾類
public class MusicPhoneDecorate extends PhoneDecorate {
public MusicPhoneDecorate(Phone p) {
super(p);
}
@Override
public void call() {
System.out.println("手機可以聽彩鈴");
super.call();
}
}
定義一個AdPhoneDecorate具體的裝飾類
public class AdPhoneDecorate extends PhoneDecorate {
public AdPhoneDecorate(Phone p) {
super(p);
}
@Override
public void call() {
super.call();
System.out.println("手機可以聽廣告了");
}
}
定義一個測試類
public class PhoneDemo {
public static void main(String[] args) {
Phone p = new PhoneImpl();
p.call();
System.out.println("-------------");
PhoneDecorate pd = new MusicPhoneDecorate(p);
pd.call();
System.out.println("-------------");
pd = new AdPhoneDecorate(p);
pd.call();
System.out.println("-------------");
pd = new AdPhoneDecorate(new MusicPhoneDecorate(p));
pd.call();
System.out.println("-------------");
pd = new MusicPhoneDecorate(new AdPhoneDecorate(p));
pd.call();
System.out.println("-------------");
}
}
打印結(jié)果如下:

屏幕快照 2016-12-02 17.59.28.png