簡體   English   中英

我們可以將裝飾對象的實例設為私有,而不是在抽象裝飾器中進行保護嗎?

[英]Can we make the instance of the decorated object private instead of protected in an abstract decorator?

我注意到,大多數示例對正在裝飾的實例使用受保護的實例。 我也可以使用私人嗎?

public abstract class CoffeeDecorator implements Coffee {
    protected Coffee decoratedCoffee;

    public CoffeeDecorator(Coffee c) {
        this.decoratedCoffee = c;
    }
    // ...
}

裝飾器模式用作繼承的替代方法,有助於在無需修改或擴展自身的情況下添加類的其他功能。

我將使用private屬性來裝飾它,而不使用abstract類。 在一個非常簡單的示例上進行了演示:

CupOfCoffee.java

final class CupOfCoffee implements Coffee {

    public final String prepareCoffee() {
        return "Coffee";
    }
}

SugarCoffee.java

final class SugarCoffee implements Coffee {

    private final Coffee coffee;

    public SugarCoffee(final Coffee coffee) {
        this.coffee = coffee;
    }

    public final String prepareCoffee() {
        return coffee.prepareCoffee() + " with sugar";
    }
}

MilkCoffee.java

final class MilkCoffee implements Coffee {

    private final Coffee coffee;

    public MilkCoffee(final Coffee coffee) {
        this.coffee = coffee;
    }

    public final String prepareCoffee() {
        return coffee.prepareCoffee() + " with milk";
    }
}

使用可組合垂直裝飾器的演示:

new MilkCoffee(
    new SugarCoffee(
        new SugarCoffee(
            new Coffee()
        )
    )
).prepareCoffee()           // Coffee with sugar with sugar with milk

因為裝飾者只能通過組件接口(在您的情況下為Coffee )訪問其裝飾的實例,所以不僅應該,而且還希望在抽象類中將實例設為私有。 進行這項工作的關鍵是在抽象類中為組件接口的所有方法定義委托方法。 這樣就可以通過超級調用來訪問裝飾元素。 這是對Nikolas的回答的看法,該回答也使用了抽象類:

public interface Coffee { String description(); }

abstract class CoffeeDecorator implements Coffee {

    private final Coffee decorated;

    public CoffeeDecorator(Coffee decorated) 
    { this.decorated = decorated; }

    public String description() 
    { return decorated.description(); }
}

final class BlackCoffee implements Coffee
{
    public String description() { return "Coffee"; }
}

final class MilkDecoration extends CoffeeDecorator 
{
    public MilkDecoration(Coffee coffee) { super(coffee); }

    public String description() { return super.description() + " + milk"; }
}

final class SugarDecoration extends CoffeeDecorator
{
    public SugarDecoration(Coffee coffee) { super(coffee); }

    public String description() { return super.description() + " + sugar"; }
}

注意,由於所有接口方法都已實現(作為裝飾實例的簡單委托),因此從技術上講,不必聲明抽象裝飾器abstract 但是,這是傳達設計意圖的一種好方法,該意圖是該類將由具體裝飾器繼承。

暫無
暫無

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

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