裝飾設計模式是對已經存在的對象增加新的功能,相比繼承不會那麼臃腫
首先定義一個接口,手機最基本的功能打電話
public interface Mobile {
public void call();
}
定義抽象的裝飾類實現Mobile接口
public abstract class MobileDecorate implements Mobile {
private Mobile moblie;
public MobileDecorate(Mobile moblie) {
this.moblie = moblie;
}
@Override
public void call() {
this.moblie.call();
}
}
手機最基本的功能打電話的類
/**
* 手機最基本的功能
*/
public class MobileCall implements Mobile {
@Override
public void call() {
System.out.println("手機可以打電話");
}
}
增強功能的類--聽MP3 要繼承裝飾類MobileDecorate
/**
* 手機聽MP3類
*/
public class MobileMp3 extends MobileDecorate{
public MobileMp3(Mobile moblie) {
super(moblie);
}
@Override
public void call() {
super.call();
System.out.println("手機聽MP3");
}
}
增強功能的類--看電影 要繼承裝飾類MobileDecorate
/**
* 手機看電影類
*/
public class MobileMovie extends MobileDecorate{
public MobileMovie(Mobile moblie) {
super(moblie);
}
@Override
public void call() {
super.call();
System.out.println("用手機看電影");
}
}
測試類
public static void main(String[] args) {
//普通手機
Mobile 小靈通 = new MobileCall();
小靈通.call();
System.out.println("----------------");
//增加MP3功能的手機(傳原有的對象)
MobileDecorate mobileDecorate = new MobileMp3(小靈通);
mobileDecorate.call();
System.out.println("----------------");
//增加播放電影功能手機(傳原有的對象)
mobileDecorate = new MobileMovie(小靈通);
mobileDecorate.call();
System.out.println("----------------");
//增加MP3和播放電影功能手機(無需新建MP3功能和電影功能的類)
mobileDecorate = new MobileMovie(new MobileMp3(小靈通));
mobileDecorate.call();
}
執行結果:
手機可以打電話
----------------
手機可以打電話
手機聽MP3
----------------
手機可以打電話
用手機看電影
----------------
手機可以打電話
手機聽MP3
用手機看電影