設計模式 裝飾者模式

2021-10-07 15:04:37 字數 2412 閱讀 9558

先不講設計模式,先講乙個生活中的例子。山東煎餅(或者肉夾饃)相信大家都吃過,可以自己選擇需要的食材,比如,可以加一串里脊,或者培根,多加個蛋,到最後,老闆會根據你選擇的不同食材給你算**。其實我們可以拆分開,乙個基本麵餅+雞蛋+生菜+里脊+豆奶,這就是一層一層巢狀起來,最後只要輸出最終**。這就是裝飾者模式,裝飾者模式本質是一種組合的思想(不同於繼承的思想),多組合少繼承,一層一層新增,共存的意思

裝飾者模式:動態將職責附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更具彈性的代替方案。

component是定義乙個物件介面,可以給這些物件動態的新增職責。concretecomponent是定義乙個具體的基礎物件,就好比肉夾饃的白吉饃,山東煎餅的麵餅。可以給這個concretecomponent物件新增一些職責,他就是decorator,裝飾抽象類,繼承了component,從外類來擴充套件component類的功能,但對component來說,是無需知道decorator的存在,至於concretecomponent就是具體的裝飾物件,起到了給component新增職責的功能。

下面用**舉個例子(以山東煎餅為例):

//component用於計算這個山東煎餅有啥,多少錢

public

abstract

class

component

上面定義乙個通用介面用來抽象化增強的行為,下面定義具體的基類,山東煎餅最基礎的就是一張麵皮,啥都可以不要,你看到麵皮,勉強認出他是山東煎餅,所以麵皮就是最基礎的。

public

class

concretecomponent

extends

component

/** * 煎餅裡有啥

*/@override

public

void

show()

}

既然基礎有了,我的裝飾是啥,就是里脊、雞蛋、生菜這些東西,所以定乙個抽象的,大家都按照這個加。

public

abstract

class

decorator

extends

component

protected

abstract integer docalculate()

;protected

abstract

void

doshow()

;/**

* 計算**,整數不找零

*/@override

public integer calculate()

}/**

* 煎餅裡有啥

*/@override

public

void

show()

}}

下面只要定義好裝飾器。

//加雞蛋

public

class

concretedecoratora

extends

decorator

@override

public

void

doshow()

}//加里脊

public

class

concretedecoratorb

extends

decorator

@override

public

void

doshow()

}

具體的用法:

void

main()

與**模式的不同這兩個設計模式看起來很像。對裝飾器模式來說,裝飾者(decorator)和被裝飾者(decoratee)都實現同乙個 介面。對**模式來說,**類(proxy class)和真實處理的類(real class)都實現同乙個介面。此外,不論我們使用哪乙個模式,都可以很容易地在真實物件的方法前面或者後面加上自定義的方法。

然而,實際上,在裝飾器模式和**模式之間還是有很多差別的。裝飾器模式關注於在乙個物件上動態的新增方法,然而**模式關注於控制對物件的訪問。換句話 說,用**模式,**類(proxy class)可以對它的客戶隱藏乙個物件的具體資訊。因此,當使用**模式的時候,我們常常在乙個**類中建立乙個物件的例項。並且,當我們使用裝飾器模 式的時候,我們通常的做法是將原始物件作為乙個引數傳給裝飾者的構造器。可以理解成,裝飾器模式是**模式+策略模式(有可能理解的不恰當)。上面的例子是山東煎餅,如果適配乙個肉夾饃,他也是可以加生菜和雞蛋。

設計模式 裝飾者模式

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

設計模式 裝飾者模式

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

設計模式 裝飾者模式

好幾天沒出部落格了,在學習android的一些新控制項的時候,用到了乙個模式,叫裝飾者模式,所以在此講講這個模式。模式,包含以下四個角色 1 抽象構件 component 角色 給出乙個抽象介面,以規範準備接收附加責任的物件。2 具體構件 concretecomponent 角色 定義乙個將要接收附...