裝飾者模式

2021-08-20 11:00:39 字數 2477 閱讀 9900

設計模式本質上就是「solid設計原則」在實際應用中的具體體現,我們在實際開發中要盡量面向抽象程式設計、面向介面程式設計。顧客->選單

裝飾者模式的作用:能夠在不修改目標類也不使用繼承的情況下,動態地對類進行擴充套件,它是通過建立乙個包裝物件(裝飾者)來達到增強目標類的目的。

裝飾者模式的實現有兩個要求:

1、裝飾者類與目標類要實現相同的介面,或繼成自同一類

2、裝飾者類中要有目標類的引用作為成員變數,實際賦值一般通過帶參構造器完成

本例中只能對目標類進行單一裝飾,核心部分是通過帶參構造方法把目標類傳到裝飾者類當中,然後在裝飾者類中對目標類進行裝飾(即增強)。

程式結構圖如下:

}本例中可以對目標類進行多種裝飾,核心部分是通過帶參構造方法把目標類傳到裝飾者類當中,然後在裝飾者類中對目標類進行裝飾(即增強)。

之所以在這裡能夠形成裝飾者鏈,是因為帶參構造器中的引數是介面型別的,這樣才能接收多種型別的目標類,這也算是體現了面向抽象程式設計、面向介面程式設計的好處吧。

第二步與第一步的主要區別是裝飾者類的命名方式不同,如果單純從**的角度來考慮,第一步也可以實現鏈式裝飾,但是第一步中的裝飾者類名是「someservicedecorator」,如果想實現鏈式裝飾難道再建乙個「someservicedecorator2」?這顯然不合適,「someservicedecorator」表示對someservice進行綜合裝飾,就不應該再出現其他裝飾者;如果想對目標類進行逐步裝飾的話,就應該使用第二步的命名方式,用具體的裝飾功能進行命名,這樣才更符合oop思想,也更具有可讀性。

不同的命名方式體現了不同的設計思想,現在我對這一理念有了更豐富的理解。

程式結構圖如下:

}注意裝飾鏈的裝飾順序:

isomeservice replace = new replacedecorator(toupper);是把toupper作為引數傳到replace中,簡化之後的執行順序大概是這樣的***.toupper().replace(),因此是toupper()先執行,replace()後執行。

public inte***ce isomeservice 

public class someservice implements isomeservice

} private isomeservice target;

this.target = target;

} @override

public string dosome()

} public toupperdecorator() {}

public toupperdecorator(isomeservice target)

@override

public string dosome()

} public replacedecorator() {}

public replacedecorator(isomeservice target)

@override

public string dosome()

}public class mytest

}

裝飾者模式

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

裝飾者模式

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

裝飾者模式

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