裝飾者模式

2021-06-23 00:14:43 字數 1867 閱讀 8101

裝飾者模式的主要功能是通過物件組合的方式來拓展物件的具體功能,通過裝飾者模式,可以讓物件脫離繼承的束縛。

裝飾者模式的框架類圖如下:

由圖中可以看出:裝飾者(decorator)和被裝飾者(concretecomponent)都繼承自同乙個介面/抽象類。這也是裝飾者模式的特點,通過這種方式可以更方便後面裝飾者和被裝飾者之間的組合。

其實所謂的組合,更形象點說是用裝飾者把被裝飾者給包裝起來(把被裝飾者的物件引用加到裝飾者的物件中去)。下面我們來看一下具體的實現**。

1:首先我們要建立component抽象類/介面(本例項中用的是介面)

inte***ce beverage

string description

string getdescription();

double cost();

}

設計模式中有乙個重要原則就是:把要變化的行為和屬性分離出來。這裡我們把一些裝飾者和被裝飾者所應該共有的方法和屬性加入公共的介面中。

2:然後我們來寫decorator的抽象類

abstract class decorator:beverage

public string description

public abstract string getdescription();

public virtual double cost()

}

此類中把 cost實現了,並且設為virtual是為了讓繼承它的所有子類可以直接呼叫cost()方法,如果需要修改調料的**,則只需要重寫此方法即可。

3:開始編寫修飾者和被修飾者的實體類:

乙個具體的義大利濃咖啡類(被修飾者):

class expresso:beverage

public string description

public expresso(double kosten, string description)

public string getdescription()

public double cost()

}

乙個具體的牛奶類(修飾者)

class milk:decorator

public override string getdescription()

public override double cost()

}

這裡我們重寫了牛奶類的cost方法(給**打了個8折)

4:呼叫

class program

}

總結:個人覺得裝飾者模式有乙個很大的缺點,就是經過「裝飾」後的物件型別已經不是原來的類的物件了,雖然它們還是繼承自原來那個介面/抽象類,但是想要獲得被裝飾的類的具體類資訊,已經不太可能了。

js端使用裝飾者模式:

js**不具有繼承,所以在使用裝飾者模式的時候有點摸不著頭腦,筆者強行建立了兩個js類,然後通過組合的方式勉強實現了此設計模式:

function decorator(kosten,description,obj)

this.cost=function()

}function drinks(kosten,description)

this.cost=function()

}var expresso=new drinks(3,"this is a expresso");

var milk=new decorator(0.8,"milk",expresso);

alert(milk.getdescription()+" $"+milk.cost());



裝飾者模式

裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...

裝飾者模式

裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...

裝飾者模式

裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...