Java設計模式 裝飾者模式

2021-07-12 07:03:40 字數 1911 閱讀 1803

愉快的工作又開始了。leader安排了乙個新的任務,給乙個酸奶店的點單軟體增加新的功能。

這個程式的原來所有的酸奶都繼承於乳酪類(cheese)

public

abstract

class

cheese

public

abstract

intprice();

所有具體的酸奶繼承乳酪類並重寫**price方法,以原味酸奶和宮廷酸奶為例:

public

class

original

extends

cheese

@override

public

intprice()

}public

class

court

extends

cheese

@override

public

intprice()

}

這樣的話直接呼叫實現類的introduce和price就可以得到名字和**了。

但是隨著酸奶店的規模越來越大,品種也越來越多,出現了一些新的品種的酸奶和配料,比如:士多啤梨,奧利奧,櫻桃。這些配料和酸奶進行搭配然後計算總共的**和名稱。

稍微思考一下,可能會有人選擇這樣寫**,以原味酸奶加士多啤梨為例:

public

class

originalstrawberry

extends

cheese

@override

public

intprice()

}

這樣看起來,似乎並沒有什麼不妥,但是仔細想一想,酸奶加配料這樣的組合有多少種可能呢?如果每一種可能都要寫出來乙個類的話,那麼簡直要類**,並且如果任何乙個酸奶或者配料更改了**的話,那麼所有關聯類都需要修改,如果顧客想要雙倍的士多啤梨呢?或者士多啤梨加櫻桃呢?這樣寫下去簡直是***的方法。

設計原則之一:類應該對擴充套件開發,對修改關閉。比如說對於一些我們經過測試沒有問題的**,原則上不應該修改源**,而應該在源**基礎之上進行擴充套件。

如果我們這樣設計**是不是更好一點,還是以原味酸奶加士多啤梨為例:我們先把一杯原味酸奶作為主體(被修飾者),用士多啤梨作為修飾者修飾主體。就是先得到乙個原味酸奶的物件,用士多啤梨物件修飾它,然後呼叫price方法將士多啤梨的價錢加上去。

這樣的做法可以動態的將乳酪和配料松耦合的搭配在一起。所以先把系統分為乳酪和配料兩個部分。

public

abstract

class

batching

extends

cheese

士多啤梨的實現類如下:

public

class

strawberry

extends

batching

@override

public

intprice()

@override

public string introduce()

}

櫻桃的實現類如下:

public

class

cherry

extends

batching

@override

public string introduce()

@override

public

intprice()

}

以原味酸奶加士多啤梨為例:

public

class

test

}

輸出結果:original,strawberry12

Java設計模式 裝飾者模式

動態的將責任附加到物件上,想要擴充套件功能,裝飾者提供有別於繼承的另一種選擇 這種比繼承更加靈活機動的特性,也同時意味著更加多的複雜性。裝飾模式會導致設計中出現許多小類,如果過度使用,會使程式變得很複雜。例 package com.cn.gaoyan 公共抽象介面 public abstract c...

Java設計模式 裝飾者模式

定義 裝飾模式指的是在不必改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。我們拿買蛋糕做乙個例子吧!場景 我們去甜品店買蛋糕,裡面有各種口味的蛋糕。當你想買乙個適合你口味的蛋糕,而店員卻告訴你想要蛋糕沒有。那怎麼辦呢?別灰心,店員會...

Java 裝飾者設計模式

1 首先定義乙個介面 public inte ce worker 2 定義乙個木匠類 public class carpenter implements worker 3 定義乙個水管工類 public class plumber implements worker 4 這兒是關鍵,定義乙個裝飾者類...