銆婅璁℃ā寮?鍙鐢ㄩ潰鍚戝璞¤蔣浠剁殑鍩虹銆嬪涔犵瑪璁?
鏈夌悊瑙r浠g爜涓嶅鐨勫湴鏂硅鎸囧嚭銆?
瀵硅薄琛屼負鍨嬫ā寮忎箣涓錛屽悕縐版湁寰堝Command,Action,Transaction…..
灝?strong>涓涓姹傚皝瑁呬負涓涓璞?/strong>錛屼粠鑰屼嬌浣犲彲鐢ㄤ笉鍚岀殑璇鋒眰瀵瑰鎴風榪涜鍙傛暟鍖栵紱瀵?strong>璇鋒眰鎺掗槦鎴栬褰曡姹傛棩蹇?/strong>錛屼互鍙?strong>鏀寔鍙挙閿鐨勬搷浣溿?
鍔ㄦ満錛?
濡傛灉娌℃硶鑱旂綉鍙堟兂鐜ヾota錛屽彧濂藉拰鐢佃剳AI鑷ū鑷箰涓嬨?
瀹炵幇錛?
鎴戜滑鍙互緇橝I涓嬭揪鍚勭鍛戒護錛屽鍘繪墦Roshan錛岄泦鍚堬紝鍘繪崱紲炵絳夌瓑銆?
榪欎簺鍛戒護搴旇鏈夊悓涓涓埗綾籆ommand銆?/p>
class Command {
public:
virtual ~Command() {}
virtual void execute() = 0;//鎵ц璇ヨ鍙ユ剰鍛崇潃鎵ц鍛戒護
protected:
Command() {}
};
瀵逛簬涓嶈兘琚彇娑堬紙鐩稿浜庡彇娑堟搷浣滄潵璁詫紝鍚庨潰鍐嶈錛夛紝涓嶉渶瑕佸弬鏁扮殑鍛戒護錛屼嬌鐢–++妯℃澘鏉ュ疄鐜般傚洜姝oncreteCommand鐨勫疄鐜頒負錛?/p>
template<class Receiver>
class SimpleCommand : public Command {
public:
typedef void (Receiver::*Action)();
SimpleCommand(Receiver* r, Action a) :
mReceiver(r), mAction(a)
{
}
virtual void execute()
{
(mReceiver->*mAction)();
}
private:
Action mAction;
Receiver *mReceiver;
};
Receiver鍗沖叿浣撶殑鎺ユ敹鑰咃紝涔熷氨鏄湡姝e湪鎵ц鍛戒護鐨勭被錛屾垜浠畾涔変負DotaAI錛?/p>
class DotaAI {
public:
virtual void attackRoshan()
{
cout << "Let's attack BOSS!" << endl;
}
virtual void assemble()
{
cout << "Assemble,warriors!" << endl;
}
};
璋冪敤綾誨氨寰堢畝鍗曚簡錛屾瘮濡傦細
class GamePlayer {
public:
void play()
{
DotaAI *vigoss = new DotaAI;
Command *c;
c = new SimpleCommand<DotaAI>(vigoss, &DotaAI::attackRoshan);
c->execute();
delete c;
c = new SimpleCommand<DotaAI>(vigoss, &DotaAI::assemble);
c->execute();
delete c;
delete vigoss;
}
};
鍦╩ain鍑芥暟閲宯ew涓涓綾葷殑瀵硅薄錛岃皟鐢ㄥ叾play鎺ュ彛銆?
榪愯錛?
Let's attack BOSS!
Assemble,warriors!
娌℃湁闂銆?
榪欐槸姣旇緝綆鍗曠殑涓縐嶆儏褰€侰ommand鏈変竴涓叕鍏辯殑鎺ュ彛錛屼嬌寰椾綘鍙互鐢ㄥ悓涓縐嶆柟寮忚皟鐢ㄦ墍鏈夌殑浜嬪姟銆傚悓鏃朵嬌鐢ㄨ妯″紡涔熸槗浜庢坊鍔犳柊浜嬪姟浠ユ墿灞曠郴緇熴?
濡傛灉AI鐨勬帴鍙e凡緇忕粰鐨勯潪甯稿叏闈紝閭d箞姝ゆ椂姣斿澧炲姞鏂扮殑鍛戒護濡侱efenseCommand絳夛紝鍙渶瑕佸鍔犳柊鐨刢ommand綾誨嵆鍙?
鎴栬呭鏋滃綋鏈夋柊鐨凙I鐨勭畻娉曟椂錛屽彧瑕侀噸鏂扮敓鎴怉I鐨勬寚閽堟潵灝卞彲浠ヤ簡錛堝彧瑕佹柊鍐欎竴涓戶鎵胯嚜DotaAI鐨凙I綾伙紝瀹炵幇鍏禷ttackRoshan錛宎ssemble铏氬嚱鏁板嵆鍙級銆?
鍏跺疄鍐欏埌榪欓噷灝辨湁涓涓枒闂簡錛?
鎴戠洿鎺ュ湪Play閲岃皟鐢╲igoss->attackRoshan(),vigoss->assemble()涓嶆槸鏇寸畝鍗曪紝鏇寸洿鎺ヤ箞錛?
涓昏鑰冭檻鍒拌繖縐嶆儏鍐碉細
鏈夋椂蹇呴』鎯蟲煇瀵硅薄鎻愪氦璇鋒眰錛屼絾騫朵笉鐭ラ亾鍏充簬琚姹傜殑鎿嶄綔鎴栬姹傜殑鎺ユ敹鑰呯殑浠諱綍淇℃伅銆傝孋ommand綾葷洿鍒幫紝瀹冪殑execute錛堬級鎺ュ彛浼氳皟鐢ㄦ紜殑綾伙紙Receiver錛夌殑鏂規硶銆?
鐩稿浜庢垜浠繖涓緥瀛愶紝
1. 濡傛灉鍛戒護闄や簡AI澶栵紝姣斿鍛戒護鍔ㄧ墿淇′嬌鑰屼笉鏄疉I閫佷笢瑗跨殑錛屽悓鏍峰彲浠ョ敤Command鐨勫瓙綾誨疄鐜幫紝鑰屽澶栧垯緇熶竴浣岰ommand 鎺ュ彛銆?
鍗沖皢璋冪敤鎿嶄綔鐨勫璞′笌鐭ラ亾濡備綍瀹炵幇璇ユ搷浣滅殑瀵硅薄瑙h︺?
2. 濡傛灉vigoss騫朵笉鏄湪Play錛堬級閲宯ew鍑烘潵鐨勶紝鑰孋ommand鏈夊叾鎸囬拡鐨勬儏鍐?
姝ゆ椂Client閲屾棤娉曠洿鎺ュ幓璋冪敤DotaAI鐨勬柟娉曘?
3. 鍙互灝嗗涓懡浠ゅ鍚堜負涓涓懡浠わ紝姣斿璇碊otaAI榪樻湁鍏朵粬涓浜涙柟娉曪細鍥炲煄瀹堟姢鍙ゆ爲錛屽幓榪戝崼鎵撻噹鎬紝鍘諱拱渚︽煡瀹堝崼絳夛紝閭d箞鎴戝彲浠ヨ繖鏍峰幓鍐欙細
class AttackRoshanCommand : public Command {
public:
…
void execute()
{ mAI->buyObserveGuard();
mAI->assemble();
mAI->attackRoshan();
mAI->teleport();
}
涔熷氨鏄瀵笵otaAI緇欏嚭鐨勬帴鍙e湪ConcreteCommand閲屽啀嬈IY涓嬈★紝瑙勫垝浣犵殑鎴樻湳銆傛垨鑰呭儚涔﹂噷鎻愬埌鐨凪acroCommand綾伙紝鐢ㄤ簬綆$悊涓涓瓙鍛戒護搴忓垪銆?
榪欎篃鏄疄鐜癈ommand妯″紡鏃跺簲褰撹冭檻鐨勯棶棰樹箣涓錛?
涓涓懡浠ゅ璞″簲璇ヨ揪鍒頒綍縐嶆櫤鑳界▼搴︺?
涓涓瀬绔槸瀹冧粎紜畾涓涓帴鏀惰呭拰鎵ц璇ヨ姹傜殑鍔ㄤ綔銆傚彟涓鏋佺鏄畠鑷繁瀹炵幇鎵鏈夊姛鑳斤紝鏍規湰涓嶉渶瑕侀澶栫殑鎺ユ敹鑰呭璞°?
涔﹂噷榪樻彁鍒板彟澶栬繕鏈夊嚑涓棶棰橈紝鏈変竴涓槸鏀寔鍙栨秷鍜岄噸鍋氾紝鍗硊ndo鍜宺edo銆傝繖闇瑕丆ommand鎻愪緵鏂規硶閫嗚漿錛坮everse錛夊畠浠搷浣滅殑鎵ц錛岄鍏堜慨鏀笴ommand綾伙紝澧炲姞涓涓獀irtual Unexecute()錛屽綋鐒朵笉鐢ㄦ槸綰櫄鐨勶紝鍥犱負鏈夌殑鍛戒護涓嶇敤琚彇娑堛?
鑰冭檻涓媎ota閲岀殑紲炵錛屼細浣緼I鑾峰緱鍑犵涓嶅悓鐨勭姸鎬侊紙鍔犻燂紝闅愯韓絳夌瓑錛夛紝浜庢槸鎴戜滑鍦―otaAI閲屽姞涓婅灞炴у拰鐩稿搴旂殑get錛宻et鏂規硶銆?
鍚屾椂鍐欎竴涓柊鐨勭被:
class ChangeStateCommand : public Command {
public:
ChangeStateCommand(DotaAI *ai, DotaAI::State s=DotaAI::INVALID) :
mAI(ai),
mState(s)
{
}
virtual void execute()
{
if (mState==DotaAI::INVALID) {
srand(time(NULL));
mState = static_cast<DotaAI::State>(rand()%6);
}
mLastState = mAI->getState();
mAI->setState(mState);
mAI->printState();
}
virtual void unExecute()
{
mAI->setState(mLastState);
mAI->printState();
}
private:
DotaAI *mAI;
DotaAI::State mState;
DotaAI::State mLastState;
};
DotaAI鏈韓涓嶄細鎻愪緵榪斿洖涓婁竴涓姸鎬佺殑鎺ュ彛錛屼笉榪囨垜浠彲浠ュ湪Command閲屽疄鐜幫紙Command妯″紡鐨勪紭鐐癸級銆?
mLast鐢ㄤ簬璁板綍涓婁竴鐘舵併傚鏋滈渶瑕佹挙閿澶氭錛屽彲鑳藉氨闇瑕佷竴涓垪琛ㄦ垨鑰呮爤涔嬬被鐨勬潵瀹炵幇浜嗐備絾鏃犺濡備綍錛屾寜鐓ommand璁捐妯″紡錛岃繖浜涗唬鐮佸緢鑷劧鐨勫氨瀹屾垚浜嗐傝屼笉鐢ㄤ竴鐩磋鍘繪兂姣忎釜綾葷殑鍏崇郴錛岃亴璐g瓑絳夛紙褰撶劧鍦ㄨ澶氭ā寮忛噷閫夋嫨Command妯″紡鐨勬椂鍊欐槸瑕佸幓鎬濊冪殑錛夈備絾涓鏃﹂夊畾涔嬪悗錛屼唬鐮佸氨瀹規槗緙栧啓澶氫簡銆?
闄勪歡涓哄疄渚嬩唬鐮併?/Files/izualzhy/commandDesignPattern.rar