1 . 裝飾設計模式概述
裝飾模式就是使用被裝飾類的一個子類的實例,在客戶端將這個子類的實例交給裝飾類。是繼承的替代方案。
2 . 裝飾設計模式的優點
使用裝飾模式,可以提供比繼承更靈活的擴展對象的功能,它可以動態的添加對象的功能,並且可以隨意的組合這些功能。
3 . 裝飾設計模式缺點
正因爲可以隨意組合,所以就可能出現一些不合理的邏輯
4 . 下面通過一些例子來講解裝飾模式的用法和加深對裝飾模式的理解
*以手機爲例子,手機的主要功能是打電話,除了打電話,我們可以給手機添加彩鈴和打完電話後播放音樂等其他的裝飾活動。*
1)創建手機的接口
public interface Phone {
public abstract void call();
}
2)這裏實現手機的Phone,用的是IPhone,也可以是其他的手機
public class IPhone implements Phone {
@Override
public void call() {
System.out.println("手機可以打電話了");
}
}
3)定義一個手機的裝飾類,它實現Phone接口,並且是一個抽象類
public abstract class PhoneDecorate implements Phone {
private Phone p;
public PhoneDecorate(Phone p) {
this.p = p;
}
@Override
public void call() {
this.p.call();
}
}
注意:下面兩個類即是裝飾的具體類
4)定義手機可以聽彩鈴的類
public class RingPhoneDecorate extends PhoneDecorate {
public RingPhoneDecorate(Phone p) {
super(p);
}
@Override
public void call() {
System.out.println("手機可以聽彩鈴");
super.call();
}
}
5)定義手機可以在打完電話後聽音樂的具體類
public class MusicPhoneDecorate extends PhoneDecorate {
public MusicPhoneDecorate(Phone p) {
super(p);
}
@Override
public void call() {
super.call();
System.out.println("手機可以聽音樂");
}
}
6)對上面裝飾設計模式進行測試
public class PhoneDemo {
public static void main(String[] args) {
Phone p = new IPhone();
p.call();
System.out.println("------------");
// 需求:我想在接電話前,聽彩鈴
PhoneDecorate pd = new RingPhoneDecorate(p);
pd.call();
System.out.println("------------");
// 需求:我想在接電話後,聽音樂
pd = new MusicPhoneDecorate(p);
pd.call();
System.out.println("------------");
/*==下面可以進行自由的組合=============*/
// 需求:我要想手機在接前聽彩鈴,接後聽音樂
// 自己提供裝飾類,在打電話前聽彩鈴,打電話後聽音樂
pd = new RingPhoneDecorate(new MusicPhoneDecorate(p));
pd.call();
System.out.println("----------");
/*==下面是我們用到的IO流,他採用的就是這種設計模式==*/
// 想想我們在IO流中的使用
// InputStream is = System.in;
// InputStreamReader isr = new InputStreamReader(is);
// BufferedReader br = new BufferedReader(isr);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter((new OutputStreamWriter(
System.out)));
Scanner sc = new Scanner(System.in);
}
}
5.總結
裝飾設計模式是的功能的一個擴展,在一些需要靈活的組合功能的的設計中使用它是非常好的設計方法