首頁  >  文章  >  Java  >  Java設計模式之裝飾模式的原理及實作方法是什麼?

Java設計模式之裝飾模式的原理及實作方法是什麼?

WBOY
WBOY轉載
2023-04-22 10:52:081116瀏覽

1.什麼是裝飾模式

當我們想要改進或增強某個物件的功能,而又不想繼承該類別建立子類,可以考慮使用裝飾模式。

使用裝飾模式增強物件的某個功能,比生成子類別再增強,更為靈活。

2.如何實作

1)抽像元件:定義一個抽象類,該抽象類別定義了「被裝飾者」需要被「裝飾的方法」

#2 )具體組件:抽象組件的子類別。成為「被裝飾類別」

3)裝飾元件:也是抽像元件的子類別。該類別中持有「被裝飾者」的引用,用來呼叫被裝飾者的方法。可以為抽象類,也可以是非抽象類別。

4)具體裝飾類別:是裝飾元件的子類,稱為「裝飾者」

#3.程式碼實作

1)抽像元件

/**
 * 抽象组件,定义了被装饰类需要装饰的方法
 */
public abstract class ICake {
    /**
     * 需要装饰的方法
     * @return
     */
    public abstract int getPrice();
}

2)被裝飾者

/**
 * 被装饰者,是抽象组件的一个子类,定义需要被装饰的方法
 */
public class Cake extends ICake {
    /**
     * 被装饰类中,装饰方法的基本实现
     * @return
     */
    @Override
    public int getPrice() {
        System.out.println("getPrice");
       return 100;
    }
}

3)裝飾類別

/**
 * 装饰类,也是抽象组件的一个子类。
 * 可以是抽象类,也可以是非抽象类。
 */
public abstract class CakeDecorator extends ICake {
    /**
     * 被装饰类的引用,需要在装饰类中,调用到被装饰类的方法。
     */
    ICake cake;
    public CakeDecorator(ICake cake){
        this.cake = cake;
    }
}

4)具體裝飾

/**
 * 具体装饰类
 */
public class BlueBerryCake extends CakeDecorator {
    public BlueBerryCake(ICake cake) {
        super(cake);
    }
    /**
     * 被装饰的方法
     * 在调用到被装饰类的基础方法后,还要调用装饰类要增强的方法
     * @return
     */
    @Override
    public float getPrice(){
        return cake.getPrice()+elsePrice();
    }
    /**
     * 增强的方法
     * @return
     */
    private float elsePrice(){
        System.out.println("else getPrice");
        return 50;
    }
}

5)測試類別

public class TestDecorator {
    public static void main(String args[]){
        ICake cake = new Cake();
        CakeDecorator decorater = new BlueBerryCake(cake);
        float price = decorater.getPrice();
        System.out.println(price);
    }
}

4 .拓展

1)利用子類別繼承也能實現某個方法的增強。相較於透過裝飾模式實現,裝飾模式有和優勢?

被裝飾者和裝飾者是松耦合關係。裝飾類別僅依賴抽像元件,裝飾類別只需要知道被裝飾類別是抽像元件的子類,而不必知道具體是哪個子類別。

裝飾模式滿足“開-閉原則”,不必修改特定組件,就可以增加針對該組件的裝飾類別。

5.JavaIo與裝飾模式

java.IO套件中的許多類別使用了裝飾模式。

Reader

FileReader

BufferdReader

##

以上是Java設計模式之裝飾模式的原理及實作方法是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除