自己寫的用c 實現的簡單裝飾者模式

2021-05-27 09:31:27 字數 2079 閱讀 6339

在上傳**之前,先交代一下裝飾模式的概念。。。

裝飾模式(decorator)可以在執行時動態地給物件增加功能。它也是對物件的包裝,但與介面卡模式不同的是它並沒有改變被包裝物件的介面,只是改變了它的能力範圍,而且可以遞迴組合。

通過生成子類的方式也可以為物件增加功能,但它是靜態的,而且大量的功能組合很容易產生「子類**」現象。裝飾模式可以動態、透明地給物件增加職責,並且在不需要的時候很容易去除,使用派生子類的方式無法達到這種靈活程度。

good:

當你向舊的類中新增新**時,一般是為了新增核心職責或主要行為。而當需要加入的僅僅是一些特定情況下才會執行的特定的功能時(簡單點就是不是核心應用的功能),就會增加類的複雜度。裝飾模式就是

把要新增的附加功能分別放在單獨的類中,並讓這個類包含它要裝飾的物件

,當需要執行時,客戶端就可以有選擇地、按順序地使用裝飾功能包裝物件。

下面是主要實現,參照head first的星巴茲咖啡案例實現。

#pragma once

#include #include #include using namespace std;

class cbeverage

virtual void setdescription(string strdescription)

protected:

string m_description;

};class blend: public cbeverage

};class darkroast: public cbeverage

};class decorator: public cbeverage

void setobserver(boost::shared_ptrobserved)

protected:

boost::shared_ptrgetobersver()

private:

boost::shared_ptrm_observed_;

};class milk: public decorator

int cost() };

class mocha: public decorator

int cost() };

class whip: public decorator

int cost() };

int _tmain(int argc, _tchar* argv)

{ boost::shared_ptrblendobserved(new blend);

blendobserved->setdescription("blend coffee");

boost::shared_ptrdarkroastobers(new darkroast);

darkroastobers->setdescription("darkroast coffee");

boost::shared_ptrblendwithmilk(new milk);

blendwithmilk->setobserver(blendobserved);

boost::shared_ptrblendwithmocha(new mocha);

blendwithmocha->setobserver(blendobserved);

boost::shared_ptrdarkroastwithmocha(new mocha);

darkroastwithmocha->setobserver(darkroastobers);

boost::shared_ptrblendwithmochawhip(new whip);

blendwithmochawhip->setobserver(blendwithmocha);

boost::shared_ptrblendwithmochawhipmilk(new milk);

blendwithmochawhipmilk->setobserver(blendwithmochawhip);

cout

簡單的裝飾者模式

裝飾者模式主要用來擴充套件功能的,不會改變原來物件的功能,只做擴充套件 版本一 如下 public abstract class beefnoodlepublic class basebeefnoodle extends beefnoodle public int getprice public c...

自己寫的用java實現的小爬蟲

1.獲取網頁源 public static string gethtmlresourcebyurl string url,string encoding catch exception e 隨手關閉流 finally catch ioexception e 將buffer stringbuffer型...

自己用C 寫乙個發布者訂閱者模式

突然想整理一下自己用過的這個模式,半小時寫下了這些 首先定義兩個基類,class notifier 發布者 和 class receiver 訂閱者 在發布者類中有成員 std vectorobserverlist,該vector用於儲存訂閱者物件,當發布者需要發布訊息時,訊息會被傳送給vector...