锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
/********************************************************************
created: 2006/08/04
filename: Command.h
author: 鏉庡垱
http://m.shnenglu.com/converse/
purpose: Command妯″紡鐨勬紨紺轟唬鐮?br />
*********************************************************************/
#ifndef COMMAND_H
#define COMMAND_H
class Command
{
public:
virtual ~Command() {}
virtual void Execute() = 0;
};
class Receiver
{
public:
void Action();
};
class Invoker
{
public:
Invoker(Command *pCommand);
~Invoker();
void Invoke();
private:
Command *m_pCommand;
};
class ConcreateComand
: public Command
{
public:
ConcreateComand(Receiver* pReceiver);
virtual ~ConcreateComand();
virtual void Execute();
private:
Receiver* m_pReceiver;
};
#endif
/********************************************************************
created: 2006/08/04
filename: Command.cpp
author: 鏉庡垱
http://m.shnenglu.com/converse/
purpose: Command妯″紡鐨勬紨紺轟唬鐮?br />
*********************************************************************/
#include "Command.h"
#include <iostream>
void Receiver::Action()
{
std::cout << "Receiver Action\n";
}
Invoker::Invoker(Command *pCommand)
: m_pCommand(pCommand)
{
}
Invoker::~Invoker()
{
delete m_pCommand;
m_pCommand = NULL;
}
void Invoker::Invoke()
{
if (NULL != m_pCommand)
{
m_pCommand->Execute();
}
}
ConcreateComand::ConcreateComand(Receiver* pReceiver)
: m_pReceiver(pReceiver)
{
}
ConcreateComand::~ConcreateComand()
{
delete m_pReceiver;
m_pReceiver = NULL;
}
void ConcreateComand::Execute()
{
if (NULL != m_pReceiver)
{
m_pReceiver->Action();
}
std::cout << "Execute by ConcreateComand\n";
}
/********************************************************************
created: 2006/08/04
filename: main.cpp
author: 鏉庡垱
http://m.shnenglu.com/converse/
purpose: Command妯″紡鐨勬祴璇曚唬鐮?br />
*********************************************************************/
#include "Command.h"
#include <stdlib.h>
int main()
{
Receiver* pReceiver = new Receiver();
Command* pCommand = new ConcreateComand(pReceiver);
Invoker* pInvoker = new Invoker(pCommand);
pInvoker->Invoke();
delete pInvoker;
system("pause");
return 0;
}
/********************************************************************
created: 2006/07/20
filename: ChainOfResponsibility.h
author: 鏉庡垱
http://m.shnenglu.com/converse/
purpose: ChainOfResponsibility妯″紡鐨勬紨紺轟唬鐮?br />
*********************************************************************/
#ifndef CHAINOFRESPONSIBILITY_H
#define CHAINOFRESPONSIBILITY_H
#include <stdio.h>
// 鎶借薄鍩虹被,瀹氫箟涓涓鐞嗚姹傜殑鎺ュ彛
class Handler
{
public:
Handler(Handler *pSuccessor = NULL);
virtual ~Handler();
// 綰櫄鍑芥暟,鐢辨淳鐢熺被瀹炵幇
virtual void HandleRequset() = 0;
protected:
Handler* m_pSuccessor;
};
class ConcreateHandler1
: public Handler
{
public:
ConcreateHandler1(Handler *pSuccessor = NULL) : Handler(pSuccessor){}
virtual ~ConcreateHandler1(){}
virtual void HandleRequset();
};
class ConcreateHandler2
: public Handler
{
public:
ConcreateHandler2(Handler *pSuccessor = NULL) : Handler(pSuccessor){}
virtual ~ConcreateHandler2(){}
virtual void HandleRequset();
};
#endif
/********************************************************************
created: 2006/07/20
filename: ChainOfResponsibility.cpp
author: 鏉庡垱
http://m.shnenglu.com/converse/
purpose: ChainOfResponsibility妯″紡鐨勬紨紺轟唬鐮?br />
*********************************************************************/
#include "ChainOfResponsibility.h"
#include <iostream>
Handler::Handler(Handler *pSuccessor /* = NULL*/)
: m_pSuccessor(pSuccessor)
{
}
Handler::~Handler()
{
delete m_pSuccessor;
m_pSuccessor = NULL;
}
void ConcreateHandler1::HandleRequset()
{
if (NULL != m_pSuccessor)
{
m_pSuccessor->HandleRequset();
}
else
{
std::cout << "HandleRequset by ConcreateHandler1\n";
}
}
void ConcreateHandler2::HandleRequset()
{
if (NULL != m_pSuccessor)
{
m_pSuccessor->HandleRequset();
}
else
{
std::cout << "HandleRequset by ConcreateHandler2\n";
}
}

/********************************************************************
created: 2006/07/20
filename: Main.cpp
author: 鏉庡垱
http://m.shnenglu.com/converse/
purpose: ChainOfResponsibility妯″紡鐨勬祴璇曚唬鐮?br />
*********************************************************************/
#include "ChainOfResponsibility.h"
#include <stdlib.h>
int main()
{
Handler *p1 = new ConcreateHandler1();
Handler *p2 = new ConcreateHandler2(p1);
p2->HandleRequset();
delete p2;
system("pause");
return 0;
}
1錛?span> 鎰忓浘
瀹氫箟涓涓垱寤哄璞$殑鎺ュ彛錛岃瀛愮被鍐沖畾瀹炰緥鍖栧摢涓駭鍝佺被銆傚伐鍘傛柟娉曚嬌涓涓璞$殑鍒涘緩寤惰繜鍒板瓙綾匯?/span>
2錛?span> 閫傜敤鎬?/span>
褰撲竴涓被涓嶇煡閬撳畠瑕佸垱寤虹殑瀵硅薄鐨勭被鏃躲?/span>
褰撲竴涓被甯屾湜鐢卞畠鐨勫瓙綾繪潵鍐沖畾鍒涘緩鍝釜綾葷殑瀵硅薄鏃躲?/span>
褰撲竴涓被鍐沖畾灝嗗垱寤哄璞″鎵樼粰澶氫釜瀛愮被錛屽茍涓斿笇鏈涘皢閭d釜瀛愮被鏄唬鐞嗚繖涓淇℃伅灞閮ㄥ寲鐨勬椂鍊欍?/span>
3錛?span> 緇撴瀯

4錛?span> 鍙備笌鑰?/span>
l Creater錛?/span>
澹版槑宸ュ巶鏂規硶鐨勬娊璞$被錛屽伐鍘傛柟娉曡繑鍥炰竴涓駭鍝佺被錛?/span>Product錛夈?/span>
鍙互璋冪敤宸ュ巶鏂規硶榪斿洖涓涓駭鍝佸璞°?/span>
l ConcreteCreater錛?/span>
閲嶅畾涔夊伐鍘傛柟娉曪紝浠ヨ繑鍥炰竴涓壒瀹氱殑product銆?/span>
l Product:
浜у搧鎶借薄綾伙紝緇欑敤鎴鋒彁渚涗竴鑷寸殑浜у搧鎺ュ彛銆?/span>
l ConcreteProduct:
鐗瑰畾鐨勪駭鍝侊紝瀹炵幇product鎺ュ彛銆?/span>
5錛?span> 鏁堟灉
宸ュ巶鏂規硶灝嗙壒瀹氱殑綾葷殑瀹炰緥鍖栧歡榪熷埌瀛愮被錛岃屼笖榪斿洖product鎺ュ彛錛屼嬌鐢ㄦ埛浠g爜涓嶇敤鍜屽叿浣撶被鎵撲氦閬擄紝涓鑷寸殑瀵瑰緟Product銆傛墍浠ュ湪鐢ㄦ埛瑕佸姞鍏ユ柊浜у搧鐨勬椂鍊欙紝鏃犻渶鏇存敼瀹㈡埛浠g爜錛屽彧闇鍔犲叆涓涓柊鐨?/span>ConcreteProduct鍜?/span>ConcreteCreater鍗沖彲錛岃繖涓篃鏄伒 瀹堜簡“寮鏀懼皝闂師鍒?#8221;銆?/span>
榪炴帴騫寵鐨勭被灞傛錛屼笂闈㈢殑緇撴瀯鍥句腑錛?/span>ConcreteCreater1瀵瑰簲鍒?/span>ConcreterProduct1鑰?/span>ConcreteCreater2瀵瑰簲鍒涘緩ConcreterProduct2銆傛墍浠?/span>creater鍜?/span>product鐨勭被灞傛鏄鉤琛岀殑錛岀敤鎴峰彧闇閫夊畾涓涓?/span>Creater錛屽氨鍒涘緩鍑哄搴?/span>product銆傚儚鏄竴涓?/span>map涓鏍鳳紝涓嶄細鍑虹幇鐗涘ご涓嶅椹槾涔嬫併?/span>
6錛?span> 瀹炵幇鍙婂彉浣?/span>
Creater鏈変袱縐嶅疄鐜幫紝涓縐嶅氨鏄娊璞$殑宸ュ巶鏂規硶錛屽叿浣撳疄鐜扮暀鍒板瓙綾匯傚彟涓縐嶅氨鏄湁涓涓己鐪佺殑瀹炵幇錛屽瓙綾諱篃鍙互閲嶆柊瀹炵幇榪欎釜鏂規硶銆傝繖縐嶆柟娉曚嬌鐢ㄤ簬鐪熺殑鏈変竴涓粯璁ょ殑Product闇瑕佸疄渚嬪寲鐨勮繖縐嶆儏鍐點?/span>
甯﹀弬鏁扮殑宸ュ巶鏂規硶錛岃繖縐嶆儏鍐靛彲浠ュ垱寤哄縐嶄駭鍝侊紝涓嶈繃鏈変釜闄愬埗灝辨槸鎵鏈変駭鍝侀兘瑕佸疄鐜?/span>product鎺ュ彛錛屽惁鍒欏氨澶卞幓宸ュ巶鏂規硶鐨勬剰涔変簡銆備唬鐮佸涓嬶細
Product* ConcreteCreater1::FactoryMethod(int nID)
{
If(nID == BUTTON)
{
return new button;
}
Else if(nID == BOX)
{
return new box;
}
…
}
鐢ㄦā鏉垮疄鐜幫紝鐪佺暐鍒涘緩瀛愮被銆?/span>
class Creater
{
public:
virtual Product* FactoryMethod() = 0;
};
template<class theProduct>
class TempCreater: public Creater
{
virtual Product* FactoryMethod();
};
template<class theProduct>
Product* TempCreater<theProduct>::FactoryMethod()
{
return new theProduct;
}
浣跨敤榪欎釜妯$増瀹㈡埛绔彧闇瀹氫箟浜у搧錛岃屼笉闇瀹氫箟creater鐨勫瓙綾匯?/span>
浜岋紟 紼嬪簭涓句緥
鍦ㄤ竴涓?/span>ACT娓告垙涓紝涓昏榪囧叧榪囩▼涓湁璁稿鏁屼漢錛屽鐙鹼紙wolf錛?/span>,铦欒潬錛?/span>bat錛?/span>,鑰佹紙BOSS錛?/span>,鍦ㄦ瘡涓鍏崇殑鍒氬紑濮嬪氨瑕佸垱寤鴻澶氫笉鍚岀殑鏁屼漢錛屽鏋滀笉鐢ㄥ伐鍘傛柟娉曪紝鍒欐妸鎵鏈夌殑鍒涘緩浠誨姟閮芥斁鍦ㄤ簡瀹㈡埛浠g爜涓紝鍒欎竴涓唬鐮佷笉鏄撴墿鍏呭拰淇敼錛屼簩鏄唬鐮佸緢鏉備貢銆傝岀敤浜嗗伐鍘傛柟娉曞垯鍙互鍏嬫湇榪欎袱涓己鐐廣傛瘮濡備綘澧炲姞涓涓柊鐨勬晫浜?/span>-鎭愰緳錛屽垯鍙渶澧炲姞涓涓亹榫欑被錛?/span>ConcreteProduct錛夛紝鍐嶅鍔犱竴涓垱寤烘亹榫欑殑綾伙紙ConcreteCreater 錛夊氨OK浜嗐?br>
婧愮爜濡備笅錛?/span>
//product abstract class
class Enemy

{
public:
virtual void attack() = 0;
virtual void Draw() = 0;
virtual ~Enemy() = 0;
};
// concrete product class
class Wolf : public Enemy

{
void attack()
{
cout << "Wolf attack me!" << endl;
}
void Draw()
{
cout << "I am Wolf!" << endl;
}
};
// concrete product class
class Bat : public Enemy

{
void attack()
{
cout << "Bat attack me!" << endl;
}
void Draw()
{
cout << "I am Bat!" << endl;
}
};
// concrete product class
class Boss : public Enemy

{
void attack()
{
cout << "Boss attack me!" << endl;
}
void Draw()
{
cout << "I am Boss!" << endl;
}
};
// creater abstract class
class EnemyCreater

{
virtual Enemy* CreateEnemy() = 0;
};
// concrete creater class
class WolfCreater : public EnemyCreater

{
Enemy* CreateEnemy()
{
return new Wolf;
}
};
// concrete creater class
class BatCreater : public EnemyCreater

{
Enemy* CreateEnemy()
{
return new Bat;
}
};
// concrete creater class
class BossCreater : public EnemyCreater

{
Enemy* CreateEnemy()
{
return new Boss;
}
};

int main(int argc, char* argv[])

{
EnemyCreater* enemyCreater[3];
enemyCreater[0] = new WolfCreater;
enemyCreater[1] = new BatCreater;
enemyCreater[2] = new BossCreater;
Enemy* cruEnemy = NULL;
for(int i = 0; i < 3; ++i)
{
cruEnemy = enemyCreater[i].CreateEnemy();
cruEnemy->Draw();
cruEnemy->attack();
delete cruEnemy;
}
return 0;
}
涓夛紟 鐩稿叧妯″紡
Abstract Factory緇忓父鐢ㄥ伐鍘傛柟娉曟潵瀹炵幇銆?/span>
宸ュ巶鏂規硶閫氬父鍦?/span>Template Methods涓璋冪敤銆?/span>
Prototypes涓嶉渶瑕佸垱寤?/span>Creater鐨勫瓙綾匯備絾鏄紝瀹冧滑閫氬父瑕佹眰涓涓拡瀵?/span>Product綾葷殑Initialize鎿嶄綔銆?/span>Creater浣跨敤Initialize鏉ュ垵濮嬪寲瀵硅薄銆傝?/span>Factory Method涓嶉渶瑕佽繖鏍風殑鎿嶄綔銆?/span>
鍥涳紟 鍙傝冩枃鐚?/span>
銆?font size=3>璁捐妯″紡綺捐В銆?/font> 娓呭崕澶у鍑虹増紺撅紝 鐔婃澃璇戙?/span>
銆婅璁℃ā寮忓彲澶嶇敤闈㈠悜瀵硅薄杞歡鐨勫熀紜銆?/span> 鏈烘宸ヤ笟鍑虹増紺撅紝 鍥涗漢鍥㈣憲銆?/span>