1. 程式人生 > 其它 >設計模式五:裝飾者模式

設計模式五:裝飾者模式

裝飾者模式指的是在不改變原類, 不使用繼承的基礎上,動態地擴充套件一個物件的功能。

1、概述

裝飾者模式指的是在不改變原類, 不使用繼承的基礎上,動態地擴充套件一個物件的功能。

2、案例演示

2.1 準備環境:

  1. 編寫一個Star介面, 提供sing 和 dance抽象方法
  2. 編寫一個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 實現步驟:

  1. 編寫一個LiuDeHuaWarpper類, 實現Star介面,重寫抽象方法
  2. 提供LiuDeHuaWarpper類的有參構造, 傳入LiuDeHua類物件
  3. 在LiuDeHuaWarpper類中對需要增強的sing方法進行增強
  4. 在LiuDeHuaWarpper類對不需要增強的方法呼叫LiuDeHua類中的同名方法

2.4 實現程式碼如下:

  1. LiuDeHua類: 被裝飾類
  2. 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();
}