設計模式2 裝飾者模式(java IO)

2021-08-16 13:54:39 字數 2711 閱讀 7456

設計類(開放-關閉原則):要對擴充套件開放,對修改關閉。多用組合,少用繼承。高內聚低耦合~

具體原因: 當我們設計的類不能滿足我們的需求的時候,我們可能設計乙個類去繼承它,但是這樣就會使物件之間高度的耦合。

此時,我們就可以考慮使用裝飾者模式(把物件嵌入我們要擴充套件功能的類中,呼叫他的方法,然後跟我們定義的方法一起返回我們需要的型別)。

這個可能跟介面卡模式有點相似,但又不同。

我們先來看看裝飾者模式的類圖,再來詳細講述:

1、component是基類。通常是乙個抽象類或者乙個介面,定義了屬性或者方法,方法的實現可以由子類實現或者自己實現。通常不會直接使用該類,而是通過繼承該類來實現特定的功能,它約束了整個繼承樹的行為。比如說,如果component代表人,即使通過裝飾也不會使人變成別的動物。

2、concretecomponent是component的子類,實現了相應的方法,它充當了「被裝飾者」的角色。

3、decorator也是component的子類,它是裝飾者共同實現的抽象類(也可以是介面)。比如說,decorator代表衣服這一類裝飾者,那麼它的子類應該是t恤、裙子這樣的具體的裝飾者。

4、concretedecorator是decorator的子類,是具體的裝飾者,由於它同時也是component的子類,因此它能方便地拓展component的狀態(比如新增新的方法)。

每個裝飾者都應該有乙個例項變數用以儲存某個component的引用,這也是利用了組合的特性。在持有component的引用後,由於其自身也是component的子類,那麼,相當於concretedecorator包裹了component,不但有component的特性,同時自身也可以有別的特性,也就是所謂的裝飾

具體例子:

當我們去咖啡廳的時候。本來你點一杯苦coffe,然後他的**是10元,你嘗了之後發現有點苦,想要加點糖,然後加這個糖的**是2元;

然後過了一會你的朋友過來了,他叫了一杯拿鐵coffee,然後加了點牛奶(假設可以加),這個牛奶的**是3元。怎麼實現?

(一) coffie抽象類

public abstract class coffee   

public abstract double cost();

}

(二)具體被裝飾者(coffie的兩種具體子類)

public class coffee1 extends coffee   

@override

public double cost()

}

public class coffee2 extends coffee   

@override

public double cost()

}

(三)裝飾者類(抽象類)

public abstract class  addthings extends coffee
(四)具體裝飾者

public class milk extends addthings  

@override

public string getcoffeeinformation()

@override

public double cost()

}

public class sugar extends addthings   

@override

public string getcoffeeinformation()

@override

public double cost()

}

(五)

public class cost        

}

裝飾者,儲存了coffie的引用,實現了cost()方法,並且在cost()方法內部,不但實現了自己的邏輯,同時也呼叫了coffie 引用的cost()方法,即獲取了被裝飾者的資訊,這是裝飾者的乙個特點

儲存引用的目的就是為了獲取被裝飾者的狀態資訊,以便將自身的特性加以組合。

(1)裝飾者和被裝飾者有相同的介面(或有相同的父類)。

(2)裝飾者儲存了乙個被裝飾者的引用。

(3)裝飾者接受所有客戶端的請求,並且這些請求最終都會返回給被裝飾者(參見韋恩圖)。

(4)在執行時動態地為物件新增屬性,不必改變物件的結構。

使用裝飾者模式的最大好處就是其拓展性十分良好,通過使用不同的裝飾類來使得物件具有多種多樣的屬性,靈活性比直接繼承好。

然而它也有缺點,那就是會出現很多小類,即裝飾類,使程式變得複雜。

設計模式No 2 裝飾者模式

要給乙個類新增屬性或方法,除了直接在原始檔中新增這種簡陋的方法外,就是繼承某個類或者與將其與某個類關聯 作為內部屬性等 起來,但如果要動態的新增,這兩種方法都不合適,裝飾者模式,應運而生。先說裝飾者模式的結構圖 最上層的介面,是抽象的被裝飾元件,裡面只有抽象的方法,緊跟其下的兩個類,左邊是具體的被裝...

設計模式 裝飾者模式

public abstract class beverage public abstract double cost public abstract class condimentdecorator extends beverage public class darkroast extends be...

設計模式 裝飾者模式

沒什麼特別的,之前看懂了,這次自己再複述一下。畢竟把別人講懂了才是真的懂了。主要參考了head first 設計模式。例子講述的是在為星巴克咖啡的製作訂單的情況,比如客人點了飲料,那麼系統會自動算出 不知道是我沒有體會到,還是這個例子不太合適,算出 那麼簡單的事還需要用到類?不過不影響我們思考裝飾者...