裝飾設(shè)計(jì)模式
就是對(duì)類(lèi)本身的功能進(jìn)行了增強(qiáng)。
其實(shí)我們?cè)?jīng)還學(xué)過(guò)一個(gè)東西请祖,也可以對(duì)類(lèi)的功能進(jìn)行增強(qiáng)订歪。
繼承。
對(duì)手機(jī)進(jìn)行功能的擴(kuò)展肆捕。
繼承:
定義一個(gè)基本的手機(jī)類(lèi):
Phone.java
我喜歡在接電話之前刷晋,聽(tīng)會(huì)鈴聲。
請(qǐng)問(wèn)怎么實(shí)現(xiàn)慎陵。
重寫(xiě)定義一個(gè)手機(jī)類(lèi)眼虱,繼承以前的手機(jī)。只不過(guò)擴(kuò)展了聽(tīng)彩鈴的功能荆姆。
MusicPhone.java
隨著需求的發(fā)展蒙幻,我的要求又改變了,我喜歡的手機(jī)是在打完電話后胆筒,可以聽(tīng)廣告的邮破。
AdPhone.java
我的要求又提高了,我想在打電話前聽(tīng)彩鈴仆救,打電話后聽(tīng)廣告抒和。
a:繼承Phone類(lèi),自己在打電話前提供聽(tīng)彩鈴功能彤蔽,打電話后聽(tīng)廣告功能摧莽。
b:繼承MusicPhone類(lèi),只添加聽(tīng)廣告功能顿痪。
c:繼承AdPhone類(lèi)镊辕,只添加聽(tīng)彩鈴功能。
隨著我的需求蚁袭,越來(lái)越多征懈,我們會(huì)發(fā)現(xiàn),這個(gè)繼承結(jié)構(gòu)也越來(lái)越龐大揩悄。
繼承結(jié)構(gòu)越判斷卖哎,將來(lái)的靈活性越差。
裝飾設(shè)計(jì)模式的組成:
接口
對(duì)接口的具體實(shí)現(xiàn)
抽象裝飾類(lèi)
具體裝飾類(lèi)
實(shí)例:
定義一個(gè)接口:定義的是那個(gè)被裝飾的抽象的東西
Phone.java
定義一個(gè)具體的事物類(lèi):
PhoneImpl.java
定義一個(gè)抽象的裝飾類(lèi):
PhoneDecorate.java
具體的裝飾類(lèi):
鈴聲裝飾類(lèi):MusicPhoneDecorate.java
廣告裝飾類(lèi):AdPhoneDecorate.java
鈴聲和廣告裝飾類(lèi):錯(cuò)誤删性。不用提供亏娜。
定義一個(gè)Phone接口
public interface Phone {
public abstract void call();
}
定義一個(gè)PhoneImpl具體實(shí)例
public class PhoneImpl implements Phone {
@Override
public void call() {
System.out.println("手機(jī)可以打電話");
}
}
定義一個(gè)PhoneDecorate抽象的裝飾類(lèi)
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();
}
}
定義一個(gè)MusicPhoneDecorate具體的裝飾類(lèi)
public class MusicPhoneDecorate extends PhoneDecorate {
public MusicPhoneDecorate(Phone p) {
super(p);
}
@Override
public void call() {
System.out.println("手機(jī)可以聽(tīng)彩鈴");
super.call();
}
}
定義一個(gè)AdPhoneDecorate具體的裝飾類(lèi)
public class AdPhoneDecorate extends PhoneDecorate {
public AdPhoneDecorate(Phone p) {
super(p);
}
@Override
public void call() {
super.call();
System.out.println("手機(jī)可以聽(tīng)廣告了");
}
}
定義一個(gè)測(cè)試類(lèi)
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("-------------");
}
}