裝飾模式:在不改變 原有類 和 不使用繼承的狀況下, 動態地擴展一個對象的功能。java
因會建立一個包裝對象,來包裹真實對象而得名。設計模式
做用:加強對象的功能測試
例子1:this
牆: 功能---遮風擋雨spa
包了牆紙的牆(本質仍是牆):設計
原功能---遮風擋雨code
新增功能---陶冶情操對象
一、沒有改變原有類繼承
二、進行動態地加強接口
裝飾類:加強功能的類(包了牆紙的牆)
被裝飾類:待加強功能的類(牆)
實現原則:
一、 裝飾類必須實現被裝飾類的全部接口
二、裝飾類中必須獲取被裝飾類對象
準備代碼
Phone接口:
public interface Phone { void call(String number); void sendMsg(); }
HWPhone實現類:
public class HWPhone implements Phone { public void call(String number) { System.out.println("撥打電話:"+number); } public void sendMsg() { System.out.println("發送短信"); } }
分析:
一、定義一個裝飾類 實現 Phone接口
二、裝飾類中 獲取到 被裝飾類對象(成員變量)
代碼實現:
HWPhoneDecorator:
public class HWPhoneDecorator implements Phone { //被裝飾類的對象 private HWPhone old; public HWPhoneDecorator(HWPhone old) { this.old = old; } /* * 打電話方法不須要加強,不須要改變 * */ public void call(String number) { old.call(number); } /** * 發短信方法須要被加強 */ public void sendMsg() { //一、先運行原來的功能 old.sendMsg(); //二、再執行新的加強代碼 System.out.println("(o゜▽゜)o☆[BINGO!]"); } }
測試類:
public static void main(String[] args) { Phone hw = new HWPhoneDecorator(new HWPhone()); hw.call("12345"); hw.sendMsg(); }
未使用裝飾者設計模式效果
撥打電話:12345
發送短信
使用裝飾者設計模式效果
撥打電話:12345
發送短信
(o゜▽゜)o☆[BINGO!]