咖啡店裡咖啡中可以加不同的配料–摩卡、牛奶、糖、奶泡;不同的飲品加上不同的配料有不同的價錢,怎樣實現呢?
可能你的第一印象會想到使用繼承,
1. 首先定義乙個咖啡基類
2. 對於加糖的,加牛奶的,加摩卡的 ,加奶泡的,分別寫乙個子類繼承
3. 對於加糖,又加奶的寫乙個類,對於對於加糖,又摩卡的寫乙個類,對於對於加糖、又奶泡的寫乙個類,對於加糖,又加奶、摩卡的寫乙個類
說到這裡,你會發現這裡四種配料就要寫十幾種實現類了,那如果我們的配料是二十幾種或者三十幾種呢,那麼使用繼承這種 方式肯定會使我們的子類**,那要怎樣解決你,答案就是使用裝飾者模式
q:為什麼裝飾器模式可以解決此問題呢?
a:因為在基類component的子類中抽象出了裝飾器(decrator)基類,並在這個基類下面新增了多個裝飾子類,就像上文中的(糖、牛奶、奶泡等)這樣呼叫的時候就可以任意組合新增什麼配料了。由此便不需要產生多種組合的子類。
裝飾器模式:實現了動態的給物件新增職能。
其中decrator類就是裝飾類基類,在裝飾類基類的子類中就是用來新增輔料。
例子:原生蛋糕,加奶油以及巧克力的例子。
#ifndef component_h_
#define component_h_
#include //定義乙個原始的抽象類蛋糕,裝飾器的功能是給蛋糕加上各種裝飾,如奶油,巧克力,瓜子仁,花生公尺等
class cake
; std::string name;};
class concretecake :public cake
void showcake();
virtual ~concretecake(){};};
#endif
decorator.**件描述具體的裝飾器的類
#include "component.h"
class cakedecrator :public cake;};
class cakedecratormilk : public cakedecrator
void showcake()
void showcake()
; virtual ~cakedecratorcholate(){};
};
客戶端**:
#include "decrator.h"
int main()
JS中裝飾器到底是什麼?
因主要的技術棧是angular,對於angular採用的裝飾器特別認可,是一種優雅的攔截js的方式。目前decorator仍處於stage 2的階段,不知道能否在es2019 es10 中推出,但乙個提案只要能進入stage 2,就基本會包括在以後的正式標準裡面。有n多文章寫道decorator是e...
「模式」是什麼
模式,顧名思義,就是 模 和 式 廣義上的 模式化 是一種原型方法prototype,它用 模 給出標準 要求,用 式 達成目標 目的。對 模 而言,式 就是 結構方法 得到結構的方法 和結構維持 結構維持的方法 而對 式 來說,模 給出了 式 的作用範圍。所以,模式化是解決具體問題的原型法方案,也...
裝飾器是什麼,有什麼功能,能用在什麼業務場景?
概念 1.裝飾器的實現是由閉包支撐的 2.裝飾器本質上是 個 python 函式,它可以在讓其他函式在不需要做任何 的變動的 前提下增加額外的功能 3.裝飾器的返回值也是 個函式的物件,它經常用於有切面需求的場景,實現路由傳參,flask 的路由傳參依賴於裝飾器,瀏覽器通過 url訪問到裝飾器的路由...