锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 娉ㄦ剰錛氳璁℃ā寮忎腑錛屾洿鎻愬′紭鍏堜嬌鐢ㄧ粍鍚堬紝鑰岄潪緇ф壙銆傝緇嗗師鍥狅紝涔熷彲浠ヤ粠浠ヤ笂妯″紡姣旇緝寰楀嚭銆?br /> 瀵硅薄閫傞厤 class ObjAdapterObject : public ... 綾婚傞厤 class ClassAdapterObject: public X, public ... 浠ヤ笅璋冪敤灝變笉鍐欎簡錛屼綘鎳傚緱鐨勩?/p>
璇ユā鍨嬩富瑕佽В鍐充袱涓垨澶氫釜瀵硅薄闂寸殑鐩鎬簰閫氫俊鐨勯棶棰樸傦紙涓漢璁や負璇ユā寮忕殑鎬濇兂鍚孫bserver妯″紡鐨勬濇兂榪樻槸鏈夌偣綾諱技鐨勩傝〃闈笂鐪嬶紝浠栦滑鎵瑙e喅鐨勯棶棰樼被鍨嬫牴鏈笉鍚岋紝閭d負浠涔堟垜浼氳繖涔堣涓轟簡錛熷悗闈㈠啀璇存槑錛夈傛寜鐞嗚錛屽悇瀵硅薄闂寸殑閫氫俊鍋囧錛歄bjA涓嶰bjB瑕佽繘琛岄氫俊銆傛柟娉曟湁濂藉縐嶃傛瘮濡傦細鍙互鍦ㄥ畠浠唴閮ㄥ悇瀛樹竴浠藉鏂圭殑寮曠敤銆傚湪涓鏂瑰彉鍔ㄦ椂錛岃皟鐢ㄥ彟涓鏂硅繘琛屽悓姝ュ嵆鍙備絾紜疄濡傛灉緋葷粺澶ц屽鏉傛椂錛岃繖灝嗘樉紺虹殑涓嶉偅涔堟竻鏅般傚洜姝わ紝灝卞笇鏈涗腑闂翠細鏈変釜璋冨仠鑰呫侻ediator妯″紡灝卞洜姝よ岀敓銆傛鏃訛紝ObjA涓嶰bjB鍐呴儴鍙瓨涓轟竴浠組ediator(MediatorObj)瀵硅薄鐨勫紩鐢ㄣ傚湪瀵硅薄鍙樺姩鏃訛紝鍙渶璋冪敤MediatorObj鐨勭浉鍏蟲帴鍙o紝閫氱煡鍏朵粬瀵硅薄闇瑕佸悓姝ユ洿鏂板嵆鍙傚洜姝わ紝瀵筄bjA鎴朞bjB鎴栧叾浠栫殑浠諱綍瀵硅薄鏉ヨ錛屽畠浠湁鍙兘鏍規湰涓嶇煡閬撹繕鏈夊叾浠栫殑瀵硅薄瀛樺湪銆傦紙濡傦細ObjA鍙兘涓嶇煡閬揙bjB鐨勫瓨鍦ㄣ傦級浣嗛氳繃MediatorObj瀵硅薄錛屽嵈杈懼埌浜哋bjA涓嶰bjB鐨勫悓姝ヤ綔鐢ㄣ傦紙鐜板湪鎯充笅錛屾槸涓嶆槸涓嶰bserver妯″紡鏈夌偣綾諱技錛熷洜涓猴紝濡傛灉鍦∣bserver妯″紡鐨勫疄鐜頒笂錛屾娊璞″嚭涓涓狪Observerable鏉ャ傞偅閫氳繃IObserverable瀵硅薄錛屽彲浠ラ氱煡鎵鏈塚iew鐨勬洿鏂幫級銆?br />
class CClassA;
class CClassB;
class CMediator
{
public:
CMediator(){}
CMediator(CClassA* pObjA, CClassB* pObjB)
{
this->m_pObjA = pObjA;
this->m_pObjB = pObjB;
}
void DoSyncFromAToB(void)
{
this->m_pObjB->xxx
}
void DoSyncFromBToA(void)
{
this->m_pObjA->xxx
}
private:
CClassA* m_pObjA;
CClassB* m_pObjB;
};
class CClassA
{
public:
CClassA(){}
CClassA(CMediator* pMediator)
{
this->m_pMediator = pMediator;
}
void DoAction(void)
{
// do some work here
// 閫氱煡鍏朵粬瀵硅薄錛岄渶瑕佸悓姝?/span>
this->m_pMediator->DoSyncFromAToB();
}
private:
CMediator* m_pMediator;
};
class CClassB
{
public:
CClassB(){}
CClassB(CMediator* pMediator)
{
this->m_pMediator = pMediator;
}
void DoAction(void)
{
// do some work here
// 閫氱煡鍏朵粬瀵硅薄錛岄渶瑕佸悓姝?/span>
this->m_pMediator->DoSyncFromBToA();
}
private:
CMediator* m_pMediator;
};
]]>
璇ユā寮忕殑鍑虹幇錛屼富瑕佹槸涓轟簡璁╃敤鎴鋒嫢鏈?#8220;鎾ら攢”鐨勬搷浣溿傚ソ緇欑敤鎴鋒湁涓仮澶嶅厛鍓嶇姸鎬佺殑鏉冨姏銆傚叾涓昏鎬濇兂灝辨槸灝嗗璞★紙鍋囪鍏剁被鍨嬩負錛欳lassA錛夌殑鍏堝墠鐘舵佽褰曡搗鏉ワ紙褰撶劧鑷繁寰楃鐞嗗ソ錛夈傚湪闇瑕佹椂錛岀敤姝ゆ仮澶嶃傛牴鎹鎬濊礬錛屽綋鐒跺疄鐜版柟娉曞氨澶氱澶氭牱銆備笅闈㈠弬鑰冭璁℃ā寮忚祫鏂欎腑鐨刢++浠g爜銆傦紙瑙夊緱姝や唬鐮佽璁¤繕鏄尯鏈夐亾鐞嗙殑銆傚洜涓哄Memento綾繪潵璇達紝闄や簡ClassA鐨勫璞″錛屽叾浠栫被鍨嬬殑瀵硅薄閮戒笉闇瑕侊紝涓斾篃涓嶅簲璇ヨ兘璁塊棶鍒般傚洜姝わ紝鍦ㄥ叿浣撳疄鐜頒笂錛屽畠鐢ㄤ簡鍙嬪厓鐨勬妧鏈級銆?
class COperationsMemento
{
//鍏跺疄鏇村己鐨勶紝鍙互灝嗚綾昏璁℃垚銆傚彲浠ョ淮鎶や竴緇勭姸鎬佺殑銆傝繖鏍鳳紝灝卞彲浠ユ敮鎸?br /> //浠繪剰鎭㈠鍒板厛鍓嶇殑絎琋縐嶇姸鎬併傚氨濂戒技photoshop鐨勫眰鐨勯偅鏍風殑鎾ら攢銆?br /> //涓鴻鏄庢濇兂錛屾鏆傛椂鍙淮鎶や竴涓姸鎬併?/span>
private:
State GetState(void)
{
return this->_sta;
}
void SetState(const State& state)
{
this->_sta = state;
}
// some code here
private:
State _sta;
};
class COperationSteps
{
public:
friend class COperationsMemento;
COperationSteps()
{
this->m_pMemento = NULL;
this->_sta = "normal";
}
COperationSteps(COperationsMemento* pMemento)
{
this->m_pMemento = pMemento;
this->_sta = "normal";
}
virtual ~COperationSteps()
{
if (m_pMemento != NULL)
{
delete m_pMemento;
m_pMemento = NULL;
}
}
//瀛樺偍鐘舵?鍗籌細淇濆瓨鐘舵?
void SaveState(void)
{
if (m_pMemento == NULL)
{
m_pMemento = new COperationsMemento();
}
m_pMemento->SetState(this->_sta);
}
//鎭㈠鐘舵?/span>
void RestoreState(COperationsMemento* pMemento = NULL)
{
if (pMemento != NULL)
{
this->_sta = pMemento->GetState();
}
else
{
this->_sta = m_pMemento->GetState();
}
}
private:
COperationsMemento* m_pMemento; //闇瑕佺淮鎶わ紝鍥犱負璇ョ姸鎬侊紝鏄嚜宸辯鏈夌殑
State _sta;
};
]]>class Strategy
2{
3public:
4 //
5 virtual void Func1(void) = 0;
6 virtual void Func2(void) = 0;//榪欎袱涓帴鍙e彧鏄ず渚?br /> 7
// some other interfaces here
8};
9
10class Sub1 : Strategy
11{
12public:
13 void Func1(void)
14 {
15 // do something
16 }
17 void Func2(void)
18 {
19 // do something
20 }
21};
22
23class Sub2 : Strategy
24{
25public:
26 void Func1(void)
27 {
28 // do something
29 }
30 void Func2(void)
31 {
32 // do something
33 }
34};
35
36class Strategy;
37//絳栫暐綾葷粨鏋?/span>
38class Context
39{
40public:
41 Context(const Strategy* pStrategyObj) : m_pStrategyObj(pStrategyObj) {}
42 //
43 // 閫昏緫鎺ュ彛DoAction
44 void DoAction(void)
45 {
46 if (NULL != m_pStragegyObj)
47 {
48 m_pStrategyObj->Func1();
49 m_pStrategyObj->Func2();
50 //
51 }
52 }
53};
]]>class LogicalAbstractClass
2{
3public:
4
// some code here
5 // 閫昏緫鎺ュ彛1
6 virtual void Logical1(
) = 0;
7 // 閫昏緫鎺ュ彛2
8 virtual bool Logical2(
) = 0;
9
// some other logical interfaces
10};
11
12class SubClassA : public LogicalAbstractClass
13{
14public:
15 void Logical1(
){
}
16 bool Logical2(
){
return true/false; }
17};
18
19class SubClassB : public LogicalAbstractClass
20{
21public:
22 void Logical1(
){
}
23 bool Logical2(
){
return true/false; }
24};
25
26int main(int argc, char* argc[])
27{
28 LogicalAbstractClass* pA = NULL;
29 LogicalAbstractClass* pB = NULL;
30 pA = new SubClassA;
31 pB = new SubClassB;
32
33 delete pB;
34 delete pA;
35}
琛ュ厖錛欴elphi鐨刢ode紺轟緥灝變笉緇欎簡銆備竴涓亾鐞嗐傛噦寰楁濇兂錛屾墍鏈夎璦閫氱敤銆?img src ="http://www.shnenglu.com/Tongy0/aggbug/148524.html" width = "1" height = "1" />
]]>
鍦ㄧ幇鏈夌殑瀵硅薄涓紝鏆傛椂娌℃湁鍔炴硶澶勭悊銆傚悓鏃訛紝鍗村彂鐜幫紝璇ュ姛鑳斤紝鍏跺疄鍙︿竴妯″潡鐨勫璞″嵈鍙互澶勭悊鐨勪簡銆傚洜姝わ紝灝卞笇鏈涜兘澶熷湪涓嶄慨鏀瑰師
鏈夋搷浣滃強緋葷粺緇撴瀯鐨勬儏鍐典笅錛屽氨鑷劧鑰岀劧鍦板皢璇ュ姛鑳藉疄鐜板嚭鏉ャ傛鏃訛紝灝卞彲浠ヤ嬌鐢ˋdapter鏉ュ鐞嗕箣銆傦紙娉細鍦ㄦ錛屾垜浠己璋冪殑鏄笉
鍘諱慨鏀瑰師鏈夌郴緇熺殑緇撴瀯鐨勬儏鍐典笅錛夈?br /> 灝變笂榪伴棶棰橈紝Adapter妯″紡鏈変袱縐嶈В鍐蟲柟娉曘備竴縐嶆槸閫氳繃瀵硅薄閫傞厤鏉ヨВ鍐熾傚彟涓縐嶆槸閫氳繃綾婚傞厤鏉ヨВ鍐熾傛墍璋撶殑瀵硅薄閫傞厤錛屾寚
鐨勬槸錛岄氳繃寮曞叆鍏鋒湁鎴戜滑闇瑕佸姛鑳芥帴鍙g殑瀵硅薄錛堣綾諱負X錛夛紝鍦ㄥ疄鐜板鐞嗚繃紼嬩腑錛屾垜浠嬌鐢ㄧ殑鏄疿鐨勫姛鑳芥帴鍙o紝浠ユ鏉ヨ揪鍒版垜浠殑闇姹傘?br />鑰岀被閫傞厤錛屽垯鎸囩殑鏄紝浜х敓涓涓柊綾伙紝璁╄鏂扮被錛岀戶鎵胯嚜X綾伙紝鍒欒嚜鐒訛紝璇ユ柊綾誨氨浼氭湁浜哫鐨勭浉鍏蟲帴鍙c備笅闈㈢湅涓嬶紝榪欎袱縐嶉傞厤鐨勪唬鐮併?/p>
class X
{
public:
...
virtual func(...);
};
{
public:
void func(...)
{
if (m_pXObj != NULL)
m_pXObj->func(...);
}
private:
X* m_pXObj;
};
class X鐨勫0鏄庡強瀹氫箟鍚屼笂銆?/p>
{
public:
...
};
錛團acade妯″紡錛夐棬闈㈡ā寮忎笌Proxy妯″紡鍏跺疄榪樻槸鏈夌偣鐩鎬技鐨勩備篃鏄富瑕佸疄鐜頒竴縐嶅姛鑳界殑灝佽銆侳acade妯″紡錛屼富瑕佹槸灝嗗嚑涓湁鐩稿叧鎬х殑鍔熻兘鎿嶄綔錛屽皝瑁呭埌涓璧鳳紝鐢辯粺涓鐨勬帴鍙f彁渚涖?br />浣跨敤鏃訛紝閫氳繃璇ユ帴鍙e嵆鍙畬鎴愭墍鏈夌浉鍏崇殑鍔熻兘銆傛鏈変釜濂藉錛屽氨鏄彁楂樿В鑰︽т笌澧炲姞楂樿仛鎬с傚疄鐜頒腑錛屾煡澶勯棶棰樹篃鐩稿鏂逛究銆?br /> 綆鍗曪紝浠g爜涓嶅氨緇欎簡銆?/p>
鍗侊細Flyweight妯″紡錛堝嵆錛氫韓鍏冩ā寮忥級
璇寸殑鐩磋鐐癸紝Flyweight妯″紡鍏跺疄灝辨槸瀹炵幇涓涓璞$紦瀛樻睜銆傚彇瀵硅薄錛屼紭鍏堜粠璇ユ睜涓彇鍑恒傝屽畠浠殑鍖哄埆鍦ㄤ簬錛氫粠鍓嶈呬腑鍙栦笢瑗挎椂錛屽鏋滀笉瀛樺湪銆傚垯鍙互鏂頒駭鐢熶竴涓紝騫惰繑鍥炪?br />鑰屼粠鍚庤呬腑鍙栨椂錛屽瓨鍦ㄥ氨榪斿洖錛屼笉瀛樺湪錛屽氨榪斿洖涓虹┖銆?br /> 鐢變笂闈㈢殑瑙i噴錛屼笉闅炬兂璞★紝璇ユā寮忕殑瀹炵幇錛?br />class Flyweight
{
public:
...
};
class SubFlyweightObjX : public Flyweight
{
...
};
class SubFlyweightObjY : public Flyweight
{
...
};
//Flyweight綾葷殑緇撴瀯
class FlyweightBuffFactory
{
public:
Flyweight* GetFlyweight(...condition...)
{
for (vector<Flyweight* >::iterator iter = m_vBuffer.begin(); iter != m_vBuffer.end(); iter++)
{
if (iter.xxx = condition)
return (Flyweight*)iter;//娉細濡傛灉姝ゅ彞涓嶈鐢ㄨ繖鍙ワ細return (Flyweight*)(&(*iter));
}
Flyweight* pReturn = new xxx;
m_vBuffer.push_back(pReturn);
return pReturn;
}
private:
vector<Flyweight* > m_vBuffer;
};
浠g悊妯″紡鍏訛紝鎬濇兂鍊掔被浼間簬灝佽鐨勬蹇點備富瑕佹槸灝嗘煇鍔熻兘鎿嶄綔閫氳繃鍙︿竴瀵硅薄錛屾潵鍏ㄦ潈澶勭悊銆傚
琚唬鐞嗙殑瀵硅薄錛屽畠涓嶇浣犳槸濡備綍澶勭悊銆傚畠鍙緇撴灉銆傛瘮濡傦細瀵規暟鎹殑鎻愬彇銆傚師鏈彲鑳借緇忚繃N涓璞″叡
鍚岄厤鍚堬紝鏈緇堝彇寰楁暟鎹傛鏃訛紝鍙互鐢ㄤ竴涓唬鐞嗗璞★紝鏉ュ叏鏉冨鐞嗕箣銆傚張姣斿璇達細鎴戜滑涓婄綉錛屾墦寮緗戦〉錛?br />鍙互閫氳繃windows鐨勭綉緇滃姛鑳芥ā鍧楋紝鍘昏В鏋愶紝騫舵渶緇堟墦寮緗戦〉銆傚悓鏃朵篃鍙互閫氳繃浠g悊錛岃В鏋愬茍鏈緇堟墦寮緗?br />欏點?/p>
涓嬮潰鏄弬鑰冧唬鐮?br />class Subject
{
public:
virtual void Request() = 0;
protected:
Subject(){}
};
class ImplSubject
{
public:
virtual void Request(){ //....}
};
class Proxy
{
public:
Proxy(){}
Proxy(Subject* sub){m_pSub = sub;}
private:
Subject* m_pSub;
void Request(){ m_pSub->Request();}
};
int main(int argc, char* argv[])
{
Subject* sub = new ImplSubject();
Proxy* p = new Proxy(sub);
p->Request();
return 0;
}
(娉?)鍋囪鏈夎繖鏍風殑涓涓棶棰樺瓨鍦紙鍏跺疄鐜板疄寮鍙戜腑錛岄潪甯哥粡甯擱亣鍒幫級錛氬熀綾籅asicClassX鏈塏涓殑媧劇敓綾匯傚洜涓哄畠浠病鏈夊姛鑳芥帴鍙oid UnknowFunction(void);
鎸夋甯哥殑銆傛垜浠殑澶勭悊鏂規硶錛岋紙1錛?鍙互閫氳繃鐩存帴淇敼BasicClassX鍩虹被錛屽湪姝ゆ坊鍔爒irtual void UnknowFunction(void);铏氭帴鍙e茍瀹炵幇錛岀劧鍚庢墍鏈塪erived
class涓潎鍙銆傦紙2錛?鍙堟垨鏄湪BasicClassX鍩虹被錛屾坊鍔犱簡綰櫄鎺ュ彛錛岀劧鍚庡湪鍏蜂綋鏌愭淳鐢熺被涓繘琛屼簡瀹炵幇銆傚湪瀹炵幇浣跨敤涓紝鐢ㄨderived class鏉ュ鐞嗐?br /> (娉?)浣嗚繖鏍峰仛浼氭湁榪欐牱鐨勯棶棰樺瓨鍦細a) 浼氭湁鍙兘璁╃戶鎵跨殑娣卞害錛屽彉鐨勫緢娣便傜郴緇熺殑綾誨皢鍙樼殑寰堝錛屽緢澶嶆潅銆俠) 綾葷殑緇撴瀯涔熷皢鍙樼殑澶嶆潅鍖栥傦紙鍥犱負鐜?br />鍦ㄦ槸澧炲姞涓帴鍙o紝浠ュ悗瑕佹槸鍙堟湁鍏朵粬鐨勬帴鍙e姛鑳介渶瑕佹坊鍔犱簡錛燂紵錛燂級 c) 鏃犲艦涓紝浼氬姞閲嶅熀綾葷殑璐熸媴銆傚洜涓哄繀欏誨緱淇濊瘉鎵╁睍璇ユ帴鍙o紝鍚﹀垯鍩虹被鐪嬩笉鍒拌鎺?br />鍙c?br /> (娉?)涓轟簡瑙e喅涓婇潰鐨勯棶棰樸侱ecorator妯″紡灝卞彲浠ュ府鍔╂垜浠緢杞繪澗鍦拌В鍐熾傛垜浠疄鐜頒竴涓狣ecorator綾匯傝綾伙紝鍙寮曠敤涓涓狟asicClassX鎸囬拡瀵硅薄鍗沖彲銆?br />鐒跺悗鍦―ecorator綾諱腑錛屾墿灞曞姛鑳芥帴鍙o紝榪欐牱錛屾柊鎵╁睍鐨勫姛鑳藉氨涓嶣asicClassX鐨勭浉鍏崇被錛屾棤浠諱綍鍏崇郴銆傚彧鏄湪BasicClassX鐩稿叧綾婚渶瑕佽鎵╁睍鎺ュ彛鐨勫湴鏂癸紝
浣跨敤Decorator綾繪潵澶勭悊鍗沖彲銆傚氨鐩稿綋浜嶣asicClassX鐨勫璞★紙鎴栨槸瀹冪殑derived class object錛夊鎵楧ecorator鏉ュ疄鐜板鐞嗕竴鏍楓備絾鍙堝悓鏃跺儚鏄皢BasicClassX
瀵硅薄涓嶥ecorator瀵硅薄榪涜緇勫悎鍦ㄤ竴璧蜂嬌鐢ㄣ備粠鑰岃揪鍒版柊鎺ュ彛鐨勬墿灞曚綔鐢ㄣ侱ecorator妯″紡灝辨槸榪欎箞鍥炰簨銆?br /> 涓嬮潰綆瑕佹彁鐐間笅Decorator綾葷殑璁捐
SubClassA : BasicClassX;
SubClassB : BasicClassX;
SubClassC : SubClassA;
...
SubClassN : ... : BasicClassX;
class Decorator : BasicClassX
{
public:
Decorator(BasicClassX* pBObj){m_pBOjb = pBObj;}
void DoOperate(void)
{
m_pBObj->DoOperator();
// do new interface
this->DoNewInterfaceFunction();
}
//new extened interface function
void DoNewInterfaceFunction(void){//do something...}
// new extened other interface function
...
//write down other code in here you knowned.
...
private:
BasicClassX* m_pBObj;
}
涓漢璁や負錛孌ecorator妯″紡錛屼綘璇村畠鏈夌敤銆傚畠紜疄鏈夌敤銆傝瀹冩病鐢ㄣ傚叾瀹炲畠涔熸病鐢ㄣ備負鍟ヨ繖鏍瘋浜嗭紵鍥犱負瀹冨畬鍏ㄥ彲浠ラ氳繃錛岀戶鎵匡紝鎴栬呯洿鎺ヤ慨鏀瑰師鏈夌殑綾諱綋緋繪潵
瀹炵幇銆備絾瀹冪殑瀛樺湪錛屼篃紜疄浼氳緋葷粺鐨勬濊礬娓呮櫚浜涖傝嚦灝戜唬鐮佺浉瀵逛笉浼氶偅涔堜貢銆?/p>
鍏細Composite妯″紡錛堝嵆錛氬鍚堟ā寮忥級
澶嶅悎妯″紡鏃ㄥ湪灝嗛掑綊澶勭悊錛岃漿鍖栦負涓縐嶉『搴忓鐞嗐傛槑鏄懼湴錛岄掑綊澶勭悊錛岀浉瀵硅緝鑰楄祫婧愩備篃鐩稿杈冧負鎶借薄浜涖傝岀敤涓涓狢omposite綾誨璞℃潵杞寲澶勭悊
閫掑綊澶勭悊銆傚皢鏄懼緱鐩磋浜涖傚畠涓嶥ecorator妯″紡鐨勫尯鍒槸錛欳omposite妯″紡錛屾棬鍦ㄦ瀯閫犱竴涓被銆傝繖涓被錛屽皢鍘熸湰鏄掑綊緇勭粐鐨勬爲鐘剁粨鏋勶紝杞崲涓虹洿瑙傚湴杞寲涓?br />欏哄簭緇撴瀯銆傚嵆錛氬畠閲嶈浜庤漿鍖栬〃鐜般傝孌ecorator妯″紡錛堝嵆錛氫慨楗版ā寮忥級錛屽叾閲嶈綆鍖栫鐞嗗師鏈郴緇熺被浣撶郴緇撴瀯銆備笉鑷充簬灝嗙被緇ф壙浣撶郴瓚婃潵瓚婃繁銆傚悓鏃訛紝涓?br />鑷充簬璁╁師鏈璁″ソ鐨勭被錛岃秺鏉ヨ秺澶嶆潅鍖栥傚悓鏃跺張鍙互涓哄師鏈被浣撶郴娣誨姞鏂扮殑鍔熻兘錛堝嵆錛氫功涓婃墍榪扮殑鏂扮殑鑱岃矗錛夈?/p>
涓嬮潰綆瑕佺湅涓嬭妯″紡鐨勪唬鐮佺粨鏋勶細
class ClassNode
{
public:
//鍐欎笅鏋勯犲嚱鏁扮瓑
...
public:
virtual void Operation(void);
virtual void Add(ClassNode* pNode);
virtual void Remove(ClassNode* pNode);
virtual ClassNode* GetNode(int iIndex);
}
//Composite綾?br />class Composite : public ClassNode
{
public:
typedef vector<ClassNode* > NODELISTVEC;
public:
void Operation(void)
{
for (NODELISTVEC::iterator iter = m_vNodeList.begin(); iter != m_vNodeList.end(); iter++)
iter->Operation();
}
void Add(ClassNode* pNode){//do something...}
void Remove(ClassNode* pNode){//do something...}
ClassNode* GetNode(int iIndex){//do something...}
private:
NODELISTVEC m_vNodeList;
}
//璋冪敤
int main(int argc, char* argv[])
{
Composite* MyCompositeForNodes = new ...;
ClassNode* xxx = new ...;//鍒涘緩鑺傜偣銆傚綋鐒惰繖閲屽彧鏄負浜嗘紨紺猴紝鎵浠ュ彧鍒涘緩涓涓妭鐐廣備竴媯墊爲鏈夊彲鑳芥湁N涓妭鐐廣?br /> MyCom,positeForNodes.Add(xxx );
...
MyCompositeForNodes.Operation();
}
//涓漢璁や負錛岃妯″紡錛屽緢鎬晩銆傘傚洜涓洪氳繃榪欐牱杞崲鍚庯紝鍘熸湰鐨勭埗瀛愬叧緋誨氨琚牬鍧忔帀浜嗐?br />//濡傛灉鏈夊ぇ渚犵悊瑙g殑娣辯殑璇濓紝錛岃繕璇蜂笉鍚濊ˉ鍏呬笅銆傘備笉鐩涙劅嬋銆?/p>
涓冿細Decorator妯″紡錛堝嵆錛氳楗版ā寮忥級
(娉?)鍋囪鏈夎繖鏍風殑涓涓棶棰樺瓨鍦紙鍏跺疄鐜板疄寮鍙戜腑錛岄潪甯哥粡甯擱亣鍒幫級錛氬熀綾籅asicClassX鏈塏涓殑媧劇敓綾匯傚洜涓哄畠浠病鏈夊姛鑳芥帴鍙oid UnknowFunction(void);
鎸夋甯哥殑銆傛垜浠殑澶勭悊鏂規硶錛岋紙1錛?鍙互閫氳繃鐩存帴淇敼BasicClassX鍩虹被錛屽湪姝ゆ坊鍔爒irtual void UnknowFunction(void);铏氭帴鍙e茍瀹炵幇錛岀劧鍚庢墍鏈塪erived
class涓潎鍙銆傦紙2錛?鍙堟垨鏄湪BasicClassX鍩虹被錛屾坊鍔犱簡綰櫄鎺ュ彛錛岀劧鍚庡湪鍏蜂綋鏌愭淳鐢熺被涓繘琛屼簡瀹炵幇銆傚湪瀹炵幇浣跨敤涓紝鐢ㄨderived class鏉ュ鐞嗐?br /> (娉?)浣嗚繖鏍峰仛浼氭湁榪欐牱鐨勯棶棰樺瓨鍦細a) 浼氭湁鍙兘璁╃戶鎵跨殑娣卞害錛屽彉鐨勫緢娣便傜郴緇熺殑綾誨皢鍙樼殑寰堝錛屽緢澶嶆潅銆俠) 綾葷殑緇撴瀯涔熷皢鍙樼殑澶嶆潅鍖栥傦紙鍥犱負鐜?br />鍦ㄦ槸澧炲姞涓帴鍙o紝浠ュ悗瑕佹槸鍙堟湁鍏朵粬鐨勬帴鍙e姛鑳介渶瑕佹坊鍔犱簡錛燂紵錛燂級 c) 鏃犲艦涓紝浼氬姞閲嶅熀綾葷殑璐熸媴銆傚洜涓哄繀欏誨緱淇濊瘉鎵╁睍璇ユ帴鍙o紝鍚﹀垯鍩虹被鐪嬩笉鍒拌鎺?br />鍙c?br /> (娉?)涓轟簡瑙e喅涓婇潰鐨勯棶棰樸侱ecorator妯″紡灝卞彲浠ュ府鍔╂垜浠緢杞繪澗鍦拌В鍐熾傛垜浠疄鐜頒竴涓狣ecorator綾匯傝綾伙紝鍙寮曠敤涓涓狟asicClassX鎸囬拡瀵硅薄鍗沖彲銆?br />鐒跺悗鍦―ecorator綾諱腑錛屾墿灞曞姛鑳芥帴鍙o紝榪欐牱錛屾柊鎵╁睍鐨勫姛鑳藉氨涓嶣asicClassX鐨勭浉鍏崇被錛屾棤浠諱綍鍏崇郴銆傚彧鏄湪BasicClassX鐩稿叧綾婚渶瑕佽鎵╁睍鎺ュ彛鐨勫湴鏂癸紝
浣跨敤Decorator綾繪潵澶勭悊鍗沖彲銆傚氨鐩稿綋浜嶣asicClassX鐨勫璞★紙鎴栨槸瀹冪殑derived class object錛夊鎵楧ecorator鏉ュ疄鐜板鐞嗕竴鏍楓備絾鍙堝悓鏃跺儚鏄皢BasicClassX
瀵硅薄涓嶥ecorator瀵硅薄榪涜緇勫悎鍦ㄤ竴璧蜂嬌鐢ㄣ備粠鑰岃揪鍒版柊鎺ュ彛鐨勬墿灞曚綔鐢ㄣ侱ecorator妯″紡灝辨槸榪欎箞鍥炰簨銆?br /> 涓嬮潰綆瑕佹彁鐐間笅Decorator綾葷殑璁捐
SubClassA : BasicClassX;
SubClassB : BasicClassX;
SubClassC : SubClassA;
...
SubClassN : ... : BasicClassX;
class Decorator : BasicClassX
{
public:
Decorator(BasicClassX* pBObj){m_pBOjb = pBObj;}
void DoOperate(void)
{
m_pBObj->DoOperator();
// do new interface
this->DoNewInterfaceFunction();
}
//new extened interface function
void DoNewInterfaceFunction(void){//do something...}
// new extened other interface function
...
//write down other code in here you knowned.
...
private:
BasicClassX* m_pBObj;
}
涓漢璁や負錛孌ecorator妯″紡錛屼綘璇村畠鏈夌敤銆傚畠紜疄鏈夌敤銆傝瀹冩病鐢ㄣ傚叾瀹炲畠涔熸病鐢ㄣ備負鍟ヨ繖鏍瘋浜嗭紵鍥犱負瀹冨畬鍏ㄥ彲浠ラ氳繃錛岀戶鎵匡紝鎴栬呯洿鎺ヤ慨鏀瑰師鏈夌殑綾諱綋緋繪潵
瀹炵幇銆備絾瀹冪殑瀛樺湪錛屼篃紜疄浼氳緋葷粺鐨勬濊礬娓呮櫚浜涖傝嚦灝戜唬鐮佺浉瀵逛笉浼氶偅涔堜貢銆?/p>
鍏細Bridge妯″紡錛堝嵆錛氭ˉ鎺ユā寮忥級
璁蹭箣鍓嶏紝鍏堝0鏄庯細鐢變簬鏈漢鐢佃剳涓嶆槸寰堝ソ錛屾病娉曡涓妚c鐜榪愯銆傚洜姝や互涓嬩唬鐮侊紝浠呮槸鎵嬪伐杈撳叆錛屽湪鐜涓湭蹇呰兘緙栬瘧閫氳繃銆?br>浣嗕互涓嬶紝浠呬粎鍙槸浠嬬粛涓縐嶆濇兂銆備粎渚涘弬鑰冦傚悓鏃訛紝濡傛灉璇存槑鏈夎涔嬪錛屾榪庢寚姝c傚彟澶栵紝鍒欎簬涓嬈℃ф墜宸ヨ緭鍏ヤ笅闈㈤偅涔堝涓滀笢錛岀‘瀹?br>涓嶅鏄擄紝鎵浠elphi鐨勫叿浣撳疄鐜般傚氨涓嶅湪姝ゅ垪鍑恒傚鏈夊叴瓚g敤Delphi瀹炵幇鐨勬湅鍙嬶紝涔熷彲浠ユ壘鏈漢浜ゆ祦錛屾湰浜虹洓鎰熻崳騫搞?br>錛堝綋鐒跺鏋滄槸C++鐨勬湅鍙嬩篃鍚屾牱銆佺敋鑷蟲洿鍔犳榪庯級
鐪嬩簡榪欎箞澶氭鐨勬ˉ鎺ユā寮忥紝榪欐鎬葷畻鏄庣櫧浜嗐傝鎯崇悊瑙fˉ鎺ユā寮忥紝涓漢璁や負錛岃繕鏄湁蹇呰鍚屾娊璞″強鍏跺疄鐜拌繘琛屼竴涓嬫瘮杈冦?br> 1) 鎶借薄鍙婂疄鐜般傛垜鐩鎬俊錛岃窡涓嶅悓鐨勪漢璇磋瘽錛岄兘浼氭湁璇紿嶅湪閲屽ご銆傚悓鏄痗oder錛岀浉淇★紝鏈榛樺鐨勬矡閫氾紝榪樻槸code鍚с傛垜浠潵鐪嬩笅鎶借薄鍙婂叾瀹炵幇鐨勪唬鐮併?br>//鎶借薄鍩虹被澹版槑
class AbstractClassX
{
private:
//xxx
protected:
//xxx
public:
//xxx
void DoSomething(void) = 0;
//xxx
}
//AbstractClassX鐨勫叿浣撳疄鐜?ClassXImplX1
class ClassXImplX1 : public AbstractClassX
{
....
public:
void DoSomething(void){ // do something with method 1... }
}
//AbstractClassX鐨勫叿浣撳疄鐜?ClassXImplX2
class ClassXImplX2 : public AbstractClassX
{
....
public:
void DoSomething(void){ // do something with method 2... }
}
鍦ㄥ疄闄呭簲鐢ㄤ腑錛屾垜浠敤鐨勬槸鎶借薄綾匯傝屽疄闄呬笂瀹炰緥鍖栫殑錛屽嵈鏄煇鍏蜂綋瀛愮被銆傝繖縐嶅疄鐜拌鎴戜滑澶氭暟浜烘墍浣跨敤銆傝屽畠瀹為檯涓婅В鍐崇殑鍙槸榪欎箞涓綾婚棶棰橈紝鍗籌細鍚屼竴琛屼負鐨勪笉鍚岃〃鐜般傚綋
鐒跺ぇ澶氭暟闇姹傦紝鐢ㄦ灝卞彲浠ヤ簡銆?br> 浣嗙幇鍦ㄥ亣濡傝鏈夎繖涔堜竴縐嶆儏鍐碉細鍋囧璇達紝涓婇潰鐨勫鐞嗕粎浠呭彧閫傜敤浜庡鉤鍙癆錛岃岀敤鎴峰嵈甯屾湜鍚屾椂錛屽畠涔熻鑳藉鍦ㄥ鉤鍙癇涓婁篃鑳藉涓鏍風殑鎿嶄綔銆傞偅褰撳浣曪紵
寰堟槑鏄劇殑錛屾縐嶉渶瑕侊紝騫朵笉鏄涓轟笂鐨勯渶姹傦紝鍥犱負涓嶈鏄湪騫沖彴A涓婅繕鏄鉤鍙癇涓婏紝閮借鎵ц鐩稿悓鐨勬搷浣溿傝屼笖琛ㄧず涔熸槸涓鏍風殑銆傝闇瑕佺殑瀹炵幇銆傚疄闄呬笂鏄渶瑕佹垜浠噸鏂板皝瑁呬釜鎶借薄灞傦紝
鏉ヤ笓闂ㄥ鐞嗗鉤鍙癇涓婄殑璇ヨ涓恒傝屽疄闄呯殑瀹炵幇錛屽嵈榪樻槸璺熷鉤鍙癆涓婄殑涓鏍楓傚叾瀹炴垜浠粩緇嗕竴鎯熾傚叾瀹炲鉤鍙癆浜嗙殑鎶借薄錛堝嵆錛欰bstractClassX錛変笌騫沖彴B涓婄殑鎶借薄錛堝亣濡備負錛欰bstractClassY錛夛紝
鍏跺疄瀹冧滑鏄被浼肩殑銆傚洜涓洪渶瑕佸鐞嗙殑鍔熻兘涓鏍楓傚洜姝わ紝鎴戜滑灝辨兂錛屽鏋滃皢榪欑鎶借薄涓庡疄鐜板叿浣撳垎紱誨紑鏉ャ傚湪鎶借薄涓紝鐣欎釜鍏蜂綋瀹炵幇鐨勬娊璞″紩鐢紙姝ゅ叾瀹炲氨鏄妯″紡鎵鎸囩殑Bridge----鍗籌細妗?br>閫氳繃璇ユˉ錛屽皢鎶借薄涓庡叿浣撶殑瀹炵幇榪炴帴璧鋒潵銆傚洜姝わ紝鎴戞兂璇ユā寮忕殑鍚嶇О灝辨槸鍥犳寰楁潵鐨勫惂錛夈傞偅鏍楓傛娊璞″彲浠ヤ笉鍙楅檺鍒剁殑鎵╁睍錛屽疄鐜頒篃鍚屾牱鍙互涓嶅彈闄愬埗鐨勬墿灞曘傝繖鏍鳳紝緋葷粺鐨勬鏋跺氨涓嶉渶瑕?br>鏇存敼錛屽叾涓嶅鍝夛紵錛佸洜姝ゅ氨鏈変簡濡備笅鐨刢ode
//******************************************************************
//* 鎶借薄澹版槑鍙婃娊璞¢儴鍒嗙殑瀹炵幇
//******************************************************************
//鎶借薄鐨勬娊璞″熀綾誨0鏄?br>class AbstractClass
{
private:
//xxx
protected:
AbstractImpl* m_pAIObj; //鍏蜂綋鐨勬娊璞″疄鐜扮殑鎶借薄瀵硅薄錛堣繖璇濆緢ao鍙o紝浣嗙悊瑙d簡榪欒瘽錛屼篃灝辯悊瑙d簡璇ユā寮忋傚彲浠ュぇ璦涓嶆儹鍦拌錛岃妯″紡鐨勭瀵嗗氨鍦ㄨ繖鍙ヨ瘽涓婏級
//xxx
public:
//xxx
void DoSomething(void) = 0;
//xxx
}
//騫沖彴A涓婄殑鎶借薄鐨勫叿浣撳疄鐜?娉ㄦ剰錛氭瀹炵幇瀛愮被錛屾槸閽堝鎶借薄鐨?
class AbstractClassA : public AbstractClass
{
private:
//xxx
protected:
//xxx
public:
//xxx
void DoSomething(void) { m_pAIObj.DoSomething(); }
//xxx
}
//騫沖彴B涓婄殑鎶借薄鐨勫叿浣撳疄鐜?娉ㄦ剰錛氭瀹炵幇瀛愮被錛屾槸閽堝鎶借薄鐨?
class AbstractClassB : public AbstractClass
{
private:
//xxx
protected:
//xxx
public:
//xxx
void DoSomething(void) { m_pAIObj.DoSomething(); }
//xxx
}
//******************************************************************
//* 瀹炵幇鐨勬娊璞″0鏄庡強鍏跺疄鐜?br>//******************************************************************
//瀹炵幇閮ㄥ垎鐨勬娊璞″熀綾誨0鏄?br>class AbstractImplClass
{
private:
//xxx
protected:
//xxx
public:
//xxx
void DoSomething(void) = 0;
//xxx
}
//鍏蜂綋綆楁硶1鐨勫叿浣撳疄鐜?br>class ImplX : public AbstractImplClass
{
private:
//xxx
protected:
//xxx
public:
//xxx
void DoSomething(void) { // do something... }
//xxx
}
//鍏蜂綋綆楁硶1鐨勫叿浣撳疄鐜?br>class ImplY : public AbstractImplClass
{
private:
//xxx
protected:
//xxx
public:
//xxx
void DoSomething(void) { // do something... }
//xxx
}
//******************************************************************
//* 瀹為檯搴旂敤鏂歸潰
//******************************************************************
int main(int argc, char* argv[])
{
AbstractImplClass* pImplObj = new ImplX();//鎴杗ew ImplY();絳夌瓑銆?br> //涓嬮潰娉ㄦ剰涓嬶細鍥犱負涓婇潰鐨勪唬鐮佷腑錛屾湰浜轟負浜嗙畝鍐欙紝騫舵病鏈夋槑紜啓鍑烘娊璞¢儴鍒嗙殑鍏蜂綋鏋勯犲嚱鏁般?br> //鐩鎬俊錛屾槸紼嬪簭鍛橈紝鐪嬪畬涓嬮潰榪欒閮芥噦寰楋紝涓婇潰鐨勬娊璞¢儴鍒嗙殑澹版槑錛屽簲璇ュ0鏄庝竴涓粈涔堟牱鐨?br> //鏋勯犲嚱鏁板惂銆?br> AbstractClass* pAbstractObj = new AbstractClassA(pImplObj);//鎴杗ew AbstractClassB(pImplObj);絳夌瓑銆?/p>
//do other something...
//鍦ㄦ琛ュ厖涓鐐癸細鏈変笂闈㈢殑璁捐錛岀郴緇熺殑妗嗘灦灝嗛兘鏃犻渶淇敼銆備笉璁烘槸瀹炵幇鐨勫叿浣撶畻娉曟敼鍙樹簡錛岃繕鏄?br> //鎶借薄鐨勯渶姹傚彉鍔ㄣ傜▼搴忛兘鏃犻渶瑕佷慨鏀規鏋朵唬鐮侊紝錛屼粎浠呭彧闇瑕佸啓涓叿浣撶殑瀹炵幇綾伙紙涓嶇鏄疄鐜扮殑瀹炵幇綾伙紝榪樻槸
//鎶借薄鐨勫疄鐜扮被錛夊嵆鍙傝繖灝辨槸妗ユ帴妯″紡銆?br>}
浜旓細Prototype妯″紡錛堝嵆錛氬師鍨嬫ā寮忥級
姝ゆā寮忓叾瀹炲緢綆鍗曪紝涓昏灝辨槸閫氳繃“鍏嬮殕”鐨勬妧鏈紝鏉ヤ駭鐢熷嚭鏂扮殑瀵硅薄鏉ャ傚叾涓庢娊璞″伐鍘傛ā寮忎互鍙夿uilder妯″紡鐨勫尯鍒槸錛氭娊璞″伐鍘傛ā寮忓紡錛屼富瑕佺敤鏉ヤ駭鐢熷涓湁鐩鎬簰渚濊禆鍏崇郴鐨勫璞$殑鍒涘緩銆?br>鑰屾瀯寤烘ā寮忓垯涓昏鐢ㄦ潵澶勭悊涓涓鏉傛ā鍧楃殑涓姝ユ鏋勫緩宸ヤ綔銆傚師鍨嬫ā寮忥紝鍒欐敞閲嶉氳繃鑷韓錛屾潵澶嶅埗鍑轟竴浠戒笌鑷韓涓鏍風殑瀹炰緥瀵硅薄鏉ャ傚師鍨嬫湰韜篃鏈夌偣綾諱技涓涓娊璞″伐鍘傘?br> 鍘熷瀷妯″紡甯哥敤鐨勬帴鍙d竴鑸湁錛欳lone(); Asign(); 榪樻湁鎷瘋礉鏋勯犲嚱鏁般傦紙瀵笵elphi鏉ヨ錛屼富瑕佽繕鏄墠涓ょ鏂規硶錛?/p>
鍓嶉潰涓鑷充簲錛屽彲琚綊綰充負錛氬垱寤哄瀷妯″紡
涓夛細Singleton妯″紡錛堝崟瀹炰緥妯″紡錛?/p>
欏懼悕鎬濅箟錛屽嵆鍗曚緥妯″紡銆傚叾涓昏鎬濇兂灝辨槸鍦ㄩ」鐩腑錛屼粎鍒涘緩涓涓疄渚嬪璞°傝瀵硅薄鐨勬娊璞★紝闄や簡閫氳繃鎸囧畾鐨勮幏鍙栧疄渚嬫帴鍙e錛屽啀娌″叾浠栧姙娉曞彲浠ュ垵濮嬪寲銆?br>姝ゅ彲浠ヤ繚璇佹暣涓郴緇熺敓鍛藉懆鏈熷唴錛屼粎浼氭湁涓涓疄渚嬪瓨鍦ㄣ傚彲浠ユ兂璞′竴涓嬶紝瀹冩槸鍙互涓庡厛鍓嶈鐨勫伐鍘傛ā寮忔垨鎶借薄宸ュ巶妯″紡緇撳悎浣跨敤鐨勩傚洜涓轟竴鑸潵璇達紝宸ュ巶鍙兘鍙細
鏈変竴涓紙鑷沖皯瀵規煇縐嶉昏緫澶勭悊鏉ヨ鏄繖鏍風殑錛夈?br> 鍦–++涓紝瀹炵幇鍗曚緥妯″紡錛岀浉瀵規瘮杈冪洿瑙傚強鍚堢悊銆傚皢璇ュ疄渚嬪畾涔夋垚static鎴愬憳鍗沖彲銆傚茍鎻愪緵鑾峰彇鍙婇噴鏀捐鎴愬憳鐨勬帴鍙c傝屽湪delphi涓紝錛堝氨鏈潵鐨勪簡瑙f潵璇達級
浼間箮騫舵病鏈夌洿瑙傜殑闈欐佹垚鍛樿繖涓璇存硶銆備絾鍙互瀹氫箟涓涓叏灞鍙橀噺錛屽茍鎻愪緵鑾峰彇涓庨噴鏀懼彉閲忕殑鎺ュ彛鏉ユā鎷熴傦紙浣嗭紝姣曠珶娌″姙娉曞悓綾誨瀷鐨勫疄渚嬭鍒涘緩鍑烘潵錛屾墍浠ユ渶濂借鍔?br>璇︾粏娉ㄩ噴璇存槑銆傚憡鐭ュ叾浠栫粍鍛橈紝姝や負鍗曞疄渚嬶級
鍙傝冪殑c++瀹炵幇錛?br> class CA
{
private:
CA(){}
private:
static CA* m_pAObj;
public:
virtual ~CA(){}
static CA* GetAObj(void)
{
if (m_pAObj == NULL)
m_pAObj = new CA();
return m_pAObj;
}
static void SafeReleaseAObj(void)
{
if (m_pAObj != NULL)
delete m_pAObj;
m_pAObj = NULL;
}
};
static CA* CA::m_pAObj = NULL;
鍙傝冪殑Delphi瀹炵幇錛?br> unit xxx
interface
uses
xxx,...,yyy;
type
TMyClass = class
//xxxx
end;
var
gAObj: TMyClass;//姝や負鍏ㄥ眬鐨勫崟瀹炰緥瀵硅薄銆?br> function GetAObj: TMyClass;
procedure SafeReleaseAObj;
implemention//榪欎釜鍗曡瘝蹇樹簡鏄笉鏄繖涔堝啓銆傚弽搴旀槸瀹炵幇鐨勯偅涓崟璇嶃傘?br> procedure SafeReleaseAObj;
begin
if Assigned(gAObj) then
FreeAndNil(gAObj);
end;
funciton GetAObj: TMyClass;
begin
if not Assigned(gAObj) then
gAObj = TMyClass.Create;
Result := gAObj;
end;
//璇存槑錛氫互涓婁粎鏄復鏃跺啓鐨勶紝騫舵湭鍦ㄧ▼搴忎腑緙栬瘧嫻嬭瘯銆備絾鎬濊礬鑲畾涓嶄細閿欍傚彲渚涘弬鑰冪敤銆?br>
鍥涳細Builder妯″紡錛堝嵆錛氭瀯寤烘ā寮忥級
寰寰鍦ㄥ疄闄呴」鐩殑寮鍙戣繃紼嬩腑浼氬彂鐜幫紝鏌愪簺妯″潡鐨勫姛鑳借繃浜庡鏉傘傛鏃訛紝鎴戜滑鑷劧灝變細鎯沖埌灝嗗叾榪涜榪涗竴姝ョ殑鍒掑垎銆傚錛氱粏鍒嗘垚DA,DB,...,DN銆傜劧鍚庣敱璇ユā鍧楃殑鏌愪釜綆$悊瑙掕壊榪涜鍗忚皟榪愪綔銆?br>榪欐牱錛孊uilder妯″紡灝嗗彲鐢ㄥ湪姝よ璁′笂銆傚叾鎬濇兂錛屽氨鏄皢澶嶆潅闂榪涗竴姝ョ粏鍖栥?/p>
璁捐妯″紡鍏跺疄鍙槸涓縐嶇▼搴忚璁$殑鎬濇兂鍑嗗垯銆傞氳繃璇ユ濇兂鍑嗗垯鏉ユ寚瀵兼垜浠殑紼嬪簭寮鍙戣涓猴紝灝介噺璁╁紑鍙戠殑紼嬪簭鏇村姞紼沖仴銆侀珮鏁堛佹濊礬娓呮櫚銆佸皯bug......
寮鍙戜竴紼嬪簭欏圭洰錛屽線寰騫朵笉鍙檺浜庡崟涓鍦頒嬌鐢ㄦ煇涓妯″紡銆傚線寰浼氬縐嶆ā寮忓悓鏃朵嬌鐢ㄣ?/p>
鍏跺疄錛岃璁℃ā寮忓湪鍏蜂綋欏圭洰涓殑搴旂敤寮鍙戜腑銆傝璇磋鐢▁xx/xxx妯″紡鏉ユ惌妗嗘灦寮鍙戠瓑絳夛紝榪欎簺閮芥槸涓嶅鐨勩傚洜涓轟釜浜鴻涓猴紝璁捐妯″紡鐨勫簲鐢紝鏄殢鐫欏圭洰鐨?br>涓嶅悓鑰屽畾鐨勩傚洜涓轟笉鍚岀殑欏圭洰鏈夌潃涓嶅悓鐨勮В鍐蟲柟妗堛傝屼笉鍚岀殑瑙e喅鏂規錛屽皢鍐沖畾鐫錛岄渶瑕佷嬌鐢ㄥ摢xxx/鍝獂xx妯″紡鏉ュ鐞嗕細姣旇緝濂斤紝姝ゆ椂鎵嶈兘璇達紝紜畾浜嗛」鐩?br>鐨勬鏋剁瓑絳夈?br> 姣斿璇達細鏈潵闇瑕佸紑鍙戜竴涓湰鍦拌祫婧愮鐞嗙殑欏圭洰銆傚鏋滀綘涓寮濮嬪氨緇欏畠瀹氫簡涓瀹氳鐢ㄥ崟瀹炰緥妯″紡鏉ユ惌妗嗘灦瀹炵幇銆傞偅鎴戜滑灝變笉鏄庣櫧浜嗚繖涓疄渚嬶紝鍦ㄦ鏋朵腑錛?br>鍒板簳瀹冨簲璇ユ槸浠涔堛傚弽榪囨潵錛屾甯哥殑錛屾垜浠簲璇ユ牴鎹繖涓」鐩殑闇瑕佹潵紜畾搴旇鐢ㄥ埌鐨勬ā寮忋傚氨鎷胯渚嬪瓙鏉ヨ銆傛垜浠彲浠ュ璧勬簮鏂歸潰錛屼嬌鐢ㄦ娊璞″伐鏍堟ā寮?br>鍦ㄨ祫婧愪笌灞曠幇鍙婂叾澶勭悊鏂歸潰錛屾垜浠彲浠ュ簲鐢ㄨ瀵熸ā寮忥紙鍗籌細鎵璋撶殑observer妯″紡錛夈傚姝や竴鏉ワ紝鎴戝緢鏄庣‘浜嗭紝璇ョ郴緇熷ぇ緗殑妗嗘灦銆傝繖姝e簲浜嗗垰寮濮嬬殑涓鍙ヨ瘽
錛氳璁℃ā寮忓彧鏄竴縐嶇▼搴忚璁$殑鎬濇兂鍑嗗垯錛屽畠鍙槸鐢ㄦ潵鎸囧紼嬪簭寮鍙戠殑琛屼負銆?/p>
褰撶劧鎯蟲噦寰楄璁℃ā寮忕殑涓滀笢錛岀‘瀹炶繕鏄涓嶅紑闈㈠悜瀵硅薄錛堢殑鎬濇兂錛夈傚oo鎬濇兂鏇磋В鐨勮秺娣卞埢錛屽璧瘋璁℃ā寮忕殑灝嗙浉瀵硅秺杞繪澗錛屼篃鏇磋В鐨勪細鏇存繁鍒諱簺錛堝綋鐒訛紝
瀛︿範瀹冨皢鏄釜涓嶆柇榪唬鐨勮繃紼嬬殑錛夈傚弽榪囨潵錛屽璁捐妯″紡鐞嗚В鐨勮秺娣卞埢錛屽oo鐨勭悊瑙e強搴旂敤涓庤璁★紝涔熷皢澶уぇ鏈夌泭銆?/p>
涓錛欶actory妯″紡錛堝伐鍘傛ā寮忥級
鎵璋撶殑Factory妯″紡錛屽嵆錛氬畠鑳界被浼煎伐鍘備竴鏍鳳紝涓嶆柇鍦頒駭鐢燂紙鍗籌細鍒涘緩錛?#8220;浜у搧”鍑烘潵銆備絾瀹冩墍鍒涘緩鍑烘潵鐨勯偅浜?#8220;浜у搧”錛屼竴鑸槸鎶借薄綾葷殑浜у搧銆備婦渚嬶細
鍋囧鏈夋娊璞$被AbstractBasicClass銆傛垜浠鎯充嬌鐢ㄥ畠錛屽繀欏誨緱鏈夊畠鐨勫疄鐜扮被銆傛寜姝e父鏉ヨ錛屾垜浠彲浠ョ洿鎺ラ氳繃鍏跺叿浣撶殑瀛愮被瀹炰緥鍖栦竴涓駭鍝佸嚭鏉ャ備絾榪欐牱浼?br>鏈変釜闂錛屽綋AbstractBasicClass鎷ユ湁N縐嶄笉鍚岀殑瀹炵幇瀛愮被鏃訛紝閭f垜浠埌搴曡浣跨敤鍝鍏蜂綋瀛愮被鏉ュ疄渚嬪寲錛屽茍涓旓紝鍚勪釜涓嶅悓鐨勫叿浣撳疄鐜板瓙綾葷殑鍛藉悕錛屼篃灝嗘槸
涓彲鎬曠殑闂銆傚洜姝よ繖鏍風殑緇存姢灝嗗彉寰楀崄鍒嗗鏉傘傝孎actory鐨勮璁″氨鍙互璧鋒潵寰堝ソ鐨勪竴涓淮鎶や綔鐢ㄣ傚叾瀹濬actory妯″紡鐨勮璁★紝榪樻湁涓涓ソ澶勶紝灝辨槸浣垮緱瀹炰緥
鍖栧緱鍒頒簡鎺ㄨ繜錛堝埌浜嗗悗鏈?---涓鑸寚鎵ц鏈燂級銆?/p>
浜岋細AbstractFactory妯″紡錛堟娊璞″伐鍘傛ā寮忥級
涓婇潰Factory妯″紡錛屽叾瀹為拡瀵圭殑鏄竴綾葷被鐨勬儏鍐碉紝鍗籌細澶勭悊鐨勪笂涓婇潰鐨凙bstractBasicClass榪欎竴綾葷被鐨勬儏鍐點傝屽疄闄呴」鐩腑錛屽嵈寰寰闇瑕佸鐞哊縐嶇殑榪欐牱鎶借薄綾匯?br>鐨勬儏鍐點傛鏃訛紝鎴戜滑灝嗚繖N縐嶇被鐨勪駭鍝佸垱寤洪兘褰掑埌涓涓狥actory涓椂錛屾鏃剁殑Factory鍗充負涓涓狝bstractFactory浜嗐傚洜姝よ錛孎actory涓嶢bstractFactory鍙笉榪?br>鏄鐞嗙殑綾誨悇綾葷殑涓暟宸紓緗簡銆傚叾鎬濇兂鏄被浼肩殑銆?br> 浣嗕竴鑸潵璇碅bstractFactory鎵浜х敓鍑烘潵鐨勭鎶借薄綾伙紝鍏跺疄瀹冧滑涔嬮棿錛屼竴鑸潵璇達紝鎴栧鎴栧皯錛屼細鏄湁涓瀹氱殑鍏崇郴鐨勩傛瘮濡傦細涓涓狝bstractfactory浜х敓鍑轟袱涓?br>鎶借薄綾葷殑浜у搧A鍜孊銆傚垯A鍙兘灝遍渶瑕丅鐨勬煇浜涘姛鑳斤紝鍙嶄箣綾諱技銆?/p>
灝忕粨錛欶actory涓嶢bstractFactory鐨勮璁★紝鏈緇堢殑鐩殑閮藉彧鏄負浜嗕嬌鐢ㄧ郴緇熸娊璞$被鐨勭淮鎶ゆ洿鍔犵畝鍗曚簺銆?/p>