在上傳**之前,先交代一下裝飾模式的概念。。。
裝飾模式(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... 1.獲取網頁源 public static string gethtmlresourcebyurl string url,string encoding catch exception e 隨手關閉流 finally catch ioexception e 將buffer stringbuffer型... 突然想整理一下自己用過的這個模式,半小時寫下了這些 首先定義兩個基類,class notifier 發布者 和 class receiver 訂閱者 在發布者類中有成員 std vectorobserverlist,該vector用於儲存訂閱者物件,當發布者需要發布訊息時,訊息會被傳送給vector...簡單的裝飾者模式
自己寫的用java實現的小爬蟲
自己用C 寫乙個發布者訂閱者模式