設計模式五:裝飾者模式
阿新 • • 發佈:2022-02-13
裝飾者模式指的是在不改變原類, 不使用繼承的基礎上,動態地擴充套件一個物件的功能。
1、概述
裝飾者模式指的是在不改變原類, 不使用繼承的基礎上,動態地擴充套件一個物件的功能。
2、案例演示
2.1 準備環境:
- 編寫一個Star介面, 提供sing 和 dance抽象方法
- 編寫一個LiuDeHua類,實現Star介面,重寫抽象方法
public interface Star {
public void sing();
public void dance();
}
public class LiuDeHua implements Star { @Override public void sing() { System.out.println("劉德華在唱忘情水..."); } @Override public void dance() { System.out.println("劉德華在跳街舞..."); } }
2.2 需求:
在不改變原類的基礎上對LiuDeHua類的sing方法進行擴充套件
2.3 實現步驟:
- 編寫一個LiuDeHuaWarpper類, 實現Star介面,重寫抽象方法
- 提供LiuDeHuaWarpper類的有參構造, 傳入LiuDeHua類物件
- 在LiuDeHuaWarpper類中對需要增強的sing方法進行增強
- 在LiuDeHuaWarpper類對不需要增強的方法呼叫LiuDeHua類中的同名方法
2.4 實現程式碼如下:
- LiuDeHua類: 被裝飾類
- LiuDeHuaWarpper類: 我們稱之為裝飾類
/* 裝飾模式遵循原則: 裝飾類和被裝飾類必須實現相同的介面 在裝飾類中必須傳入被裝飾類的引用 在裝飾類中對需要擴充套件的方法進行擴充套件 在裝飾類中對不需要擴充套件的方法呼叫被裝飾類中的同名方法 */ public class LiuDeHuaWarpper implements Star { // 存放被裝飾類的引用 private LiuDeHua liuDeHua; // 通過構造器傳入被裝飾類物件 public LiuDeHuaWarpper(LiuDeHua liuDeHua){ this.liuDeHua = liuDeHua; } @Override public void sing() { // 對需要擴充套件的方法進行擴充套件增強 System.out.println("劉德華在鳥巢的舞臺上演唱忘情水."); } @Override public void dance() { // 不需要增強的方法呼叫被裝飾類中的同名方法 liuDeHua.dance(); } }
2.5 測試結果
public static void main(String[] args) {
// 建立被裝飾類物件
LiuDeHua liuDeHua = new LiuDeHua();
// 建立裝飾類物件,被傳入被裝飾類
LiuDeHuaWarpper liuDeHuaWarpper = new LiuDeHuaWarpper(liuDeHua);
// 呼叫裝飾類的相關方法,完成方法擴充套件
liuDeHuaWarpper.sing();
liuDeHuaWarpper.dance();
}