簡體   English   中英

裝飾器模式限制

[英]Decorator pattern limitations

我有一個用例,我正在嘗試使用裝飾器模式但不確定它是否是使用模式的正確方法。 我有 2 個消息發布者 class。第一個發布者將 json 作為輸入並發布消息第二個發布者將字節作為輸入並發布消息

目前這兩個是單獨的類

public class A {
    publish(Json input);
}

public class B {
    publish(byte[] input);
}

我想用 A 裝飾 B,而不是創建一個單獨的 class。基本上用戶會輸入 Json,它會被轉換為壓縮字節並發布到接收器。 但是我在這里想到的問題是,雖然我可以用 A 裝飾 B,但我不能用 B 裝飾 A,原因是 json 可以轉換為字節 stream 但所有字節 stream 不能轉換為 json 格式,並且正在做所以會拋出異常。

所有裝飾器類都繼承相同的父接口,因此可以以任何可能的組合來裝飾類。 因此,為了使裝飾器模式正常工作,所有裝飾器都必須相互兼容,而不管它們的應用順序如何。 這種理解是正確的還是我在裝飾器模式中遺漏了一些東西。

所有裝飾器類都繼承相同的父接口,因此可以以任何可能的組合來裝飾類。 因此,為了使裝飾器模式正常工作,所有裝飾器都必須相互兼容,而不管它們的應用順序如何。 這種理解是否正確?

是的,你是絕對正確的。 這就是多態性的工作原理。

例如,我們想計算帶鞭子的咖啡的總和。 通常,價格到處都是相同的類型。 如果你有不同的類型,那么你需要創建一些轉換器 class。

讓我通過 C# 舉個例子。

這是飲料的抽象:

public abstract class Beverage
{
    public abstract string GetDescription();

    public abstract double GetCost();
}

Espresso是飲料的具體實現:

public class 濃咖啡:飲料 { public override double GetCost() { return 1; }

public override string GetDescription()
{
    return "Espresso";
}

}

這是一些可以添加或裝飾到飲料中的添加物的抽象:

public abstract class BeverageDecorator : Beverage
{
    protected Beverage _beverage;
}

WhipDecorator是飲料裝飾器的具體實現,添加:

public class WhipDecorator: BeverageDecorator
{
    public WhipDecorator(Beverage beverage)
    {
        _beverage= beverage;
    }

    public override double GetCost()
    {
        return _beverage.GetCost() + 1;
    }

    public override string GetDescription()
    {
        return _beverage.GetDescription() + " Whip";
    }
}

上面的代碼可以這樣運行:

Beverage espresso = new Espresso();
espresso = new WhipDecorator(espresso);

double cost = espresso.GetCost(); // OUTPUT: 2
string description = espresso.GetDescription(); // OUTPUT: "Espresso Whip"

我強烈建議您閱讀這本引人入勝的書Head First Design Patterns,第 2 版

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM