锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
Class A wanna class B do what he want to (command). Simple way, invoke B's method, that's a good idea, but don't follow the OO principle: decouple
How to do it?
Firstly, B is a stable class; he can in charge of all his responsibility. Maybe there are too many classes like B that A wants to invoke. So how to do it, A composition or aggregation all classes that he needs? Of course not, too much dependence with A. So let’s think about this with OO principle: Encapsulate What Varies.
There are many unpredictable commands that are the variety in this case. We need to encapsulate the command and plugin to A. So at that time, A just knows he is invoking a command, and doesn’t know who and how to execute that command.
Secondly, how to plugin to A. I don’t wanna talk about DI or Java mechanism. I am handling C++, so just add a method named SetCommand(Command* pCommand) to A, that's fine.
Lastly, I showed a UML figure 1-1 that described all the means.
Figure 1-1
Everybody’ll shout: that is command pattern. Yes.
As the title said: we used but we didn't recognize. So let’s start with its official definition:
The Command Pattern encapsulate a request as an object, thereby letting you parameterize other objects with different request, queue or log requests, and support undoable operations.
鍏充簬榪欑瘒鏂囩珷鎴戜竴鐩存兂鍐欙紝浣嗘瘡嬈℃繪槸娌℃湁涓涓棽涓嬫潵鐨勬椂闂達紝鐜板湪璇曠潃鎸ゆ瘡澶╃殑闂叉殗鏃墮棿涓鐐圭偣瀹屾垚銆?/span>
涓鐩翠互鏉ユ垜閮芥兂鍋氫竴涓蔣浠舵灦鏋勫笀錛屾墍浠ユ垜鍦ㄥ鉤鏃剁殑寮鍙戜腑闄や簡淇濊瘉鍐欏嚭楂樿川閲忕殑浠g爜澶栵紝榪樹細浠庢灦鏋勮呯殑瑙掑害鏉ヤ粩緇嗘帹鏁叉暣涓簲鐢ㄣ傚綋鐒朵簡榪欎釜鏋舵瀯涓昏鏄寚鐨勪唬鐮佺殑鏋舵瀯錛岄偅涔堟帹鏁茬殑渚濇嵁涓昏鏉ヨ嚜涓変釜鍦版柟錛?/span>
1錛?/span>GRASP
姣忓綋閬囧埌杞歡鍒嗗眰錛岀被浼間簬涓氬姟閫昏緫鏀懼湪閭d釜綾誨摢涓眰絳夐棶棰樻椂錛屾垜閫氬父閮戒細鍙傝?/span>GRASP錛?/span>General Responsibility Assignment Software Pattern銆傚寘鎷互涓嬪嚑涓師鍒欙細
A錛?/span>Information Expert 淇℃伅涓撳
B錛?/span>Creator 鍒涘緩鑰?/span>
C錛?/span>Low Coupling 浣庤﹀悎
D錛?/span>High Cohesion 楂樺唴鑱?/span>
E錛?/span>Controller 鎺у埗鍣?/span>
F錛?/span>Polymorphism 澶氭?/span>
G錛?/span>Pure Fabrication 綰櫄鏋?/span>
H錛?/span>Indirection 闂存帴錛氶伩鍏嶅璞¢棿鐩存帴鑰﹀悎錛屽悎鐞嗗垎閰嶈亴璐?/span>
G錛?/span>Protected Variations 鍙椾繚鎶ゅ彉鍖栵細寮闂師鍒欍?/span>
铏借姣忎釜鎬濇兂鎳傦紝浣嗙湡姝h兘鐢ㄥ湪瀹為檯寮鍙戜腑榪樻槸鏈変竴瀹氶毦搴︾殑錛屽叿浣撶殑浠嬬粛鍙互鍙傝冨ぇ甯?/span>CRAIG LARMAN鐨勩?/span>UML涓庢ā寮忓簲鐢ㄣ嬨?/span>
2錛?/span>Design Patterns
鍙や漢緇冨墤鍒嗕笁灞傚鐣屻傜涓灞傛槸姣忎釜鎷涘紡閮界啛璁頒簬蹇?/span>, 娌′簨灝辨嬁鍑烘潵緇冪粌錛屾瘮姝︽椂鎸夌収鑷繁鐨勫璺嚭鍓戯紝絎簩灞傚氨鏄病鏈夋嫑寮忥紝鍙湁鎬濇兂錛屽亣濡傛兂瑙f帀鍒漢鐨勫墤錛岄偅鐩爣灝辨槸瑙e墤錛岄殢渚垮嚭鍓戦兘鍙互鍋氬埌銆傜涓夊眰灝辨槸浜哄墤鍚堜竴錛岃繖縐嶅鐣屽氨宸茬粡涓嶄緷璧栦笌鍓戜簡錛岃韓杈圭殑浠諱綍鐗╀綋鍖呮嫭鑷繁閮藉彲浠ユ槸涓鎶婂墤錛岄兘鍙互緗鏂逛簬姝誨湴銆?/span>
涓栭棿涓囩墿鐨嗙浉閫氾紝鎴戣涓烘ā寮忕殑瀛︿範涔熸槸鏈変笁縐嶉樁孌碉紝23縐嶆ā寮忕啛璁頒簬蹇冿紝閬囧埌鍏蜂綋欏圭洰濂楃浉瀵瑰簲鐨勮璁℃ā寮忥紝铏界劧鏈夌偣姝繪澘錛屼絾緇欒蔣浠剁殑緇存姢鍜屾墿灞曞甫鏉ュ緢澶уソ澶勶紝榪欐槸瀛︿範璁捐妯″紡鐨勭涓灞傘傜浜屽眰灝辨槸澶ц剳涓凡緇忔病鏈夊叿浣撶殑妯″紡錛屽彧鐭ラ亾濡傛灉瑕佽В鑰︼紝閭d箞灝辮繖鏍峰仛錛屽鏋滆拷姹傝繍琛岄熷害錛屽氨閭f牱鍋氾紝榪欏氨涓嶄竴瀹氭槸23縐嶆ā寮忕殑涓縐嶄簡銆傚鏋滃凡緇忔湁鍓嶄袱灞傜殑鍔熷姏錛岄偅灝辮榪芥眰浜鴻璁℃ā寮忓悎涓錛岃繖鏃跺氨鏈夊緢澶氬彉鍖栵紝鍒涢犳ā寮忥紝涓嶄細渚濊禆涓庤璦(C, C++, JAVA絳夌瓑)錛屽悇涓鍩熺殑璁捐妯″紡絳夌瓑銆備及璁?/span>Erich Gamma搴旇鍒頒簡絎笁灞傚鐣屼簡鍚с?/span>
3. 鎴戠殑鍓嶈緢
浠栦滑鍦ㄨ繖鏂歸潰寰堟湁緇忛獙錛屾灦鏋勮繖涓笢瑗垮氨鏄鉤鏃惰縐瘡涓板瘜欏圭洰緇忛獙錛岀湅鐪嬪浗澶栫殑涓涓釜澶х墰錛岄兘涓嶆槸40澶氬瞾鐨勪漢錛屾墍浠ユ垜灝卞緢璁ㄥ帉鏌愪簺璦璁鴻杞歡鏄悆闈掓槬楗殑…
鍦ㄦ甯哥殑鎯呭喌錛屽湪鎴戠湅鏉ワ紝鐜板湪鐨勮蔣浠惰璁′粠澶х殑瑙掑害鏉ヨ灝辨槸澶嶇敤錛?/span>Reuse錛夛紝浠庡皬鐨勮搴︽潵璁插氨鏄В鑰?/span>(Decouple鎴栬?/span>separate concern)銆備綔涓轟竴鍚嶄紭縐鐨勭▼搴忓憳錛屽紑鍙戜竴涓?/span>App錛屽啓涓鍙ヤ唬鐮侀兘瑕佽冭檻鍒頒綘鍐欑殑榪欎釜綾諱笌鍏跺畠綾葷殑鍏崇郴錛屾槸涓嶆槸澶氫綑鐨勪緷璧栵紝閫備笉閫傚悎鎵╁睍絳夌瓑銆傜敱浜庤繖孌墊椂闂村伐浣滅殑闇瑕侊紝鎴戞帴榪炶漿浜嗕笁涓」鐩紝鐩澒浜嗘瘡涓」鐩灦鏋勭殑浼樼己鐐癸紝鍔犱箣鍓嶄笉涔呮垜鍙堣繘琛屼簡IJC鍏充簬RUP鐨勫煿璁紝涓?/span>IJC鐨?/span>David鍜岃拫鑳滆佸笀娣卞叆鐨勮璁轟簡杞歡寮鍙戣繃紼嬶紝鎵浠ユ垜鎯蟲妸瀛﹀埌鐨勪竴浜涜璁℃柟娉曚婦涓緥瀛愭潵璇存槑銆?/span>
鍦ㄨ繘鍏ヤ富棰樹箣鍓嶆垜鎯沖厛鍙欒堪涓浜涙蹇點?/span>
姒傚康1錛氱敱闈㈠悜榪囩▼鍒伴潰鍚戝璞$粷瀵規槸涓涓川鐨勯璺冿紝鎴戣涓?/span>OO鏈澶х殑浼樼偣鍦ㄤ簬瀹冪殑紼嬪簭璁捐鍜岀幇瀹炰笘鐣屾槸鐩稿搴旂殑錛屼粠23縐嶈璁℃ā寮忕殑鍚嶅瓧涓婇潰涔熸湁浣撶幇銆傚伐鍘傦紝浠g悊錛岄傞厤鍣ㄧ瓑絳夈?/span>
姒傚康2錛?/span>MVC錛?/span>Model-View-Controller錛屾ā鍨?/span>鈥?/span>瑙嗗浘鈥?/span>鎺у埗鍣ㄦā寮忥級鐢ㄤ簬琛ㄧず涓縐嶈蔣浠舵灦鏋勬ā寮忋傚畠鎶婅蔣浠剁郴緇熷垎涓轟笁涓熀鏈儴鍒嗭細妯″瀷錛堣嫳璇?/span>:Model錛夛紝瑙嗗浘錛?/span>View錛夊拰鎺у埗錛?/span>Controller錛夈?/span>瑙嗗浘(View)浠h〃鐢ㄦ埛浜や簰鐣岄潰錛屾帶鍒?/span>(Controller)鍙互鐞嗚В灝嗘ā鍨嬩笌瑙嗗浘鍖歸厤鍦ㄤ竴璧鳳紝鍏卞悓瀹屾垚鐢ㄦ埛鐨勮姹傘傛ā鍨嬩富瑕佹槸鎸囦笟鍔℃祦紼嬬殑鍏蜂綋緇嗚妭錛屾暣涓繃紼嬪鍥?/span>1銆傞偅涔堝叾瀹炲湪瀹為檯鐨勫紑鍙戜腑MVC榪樻槸鏈夊緢澶氬眬闄愭х殑錛屽悗闈細閫氳繃涓涓緥瀛愮粰鍑轟竴涓垜鐨勬敼榪涚増銆?/span>
鍥?/span>1
姒傚康3錛?/span>RUP
RUP錛?/span>Rational Unified Process錛岀粺涓杞歡寮鍙戣繃紼嬶紝緇熶竴杞歡榪囩▼)鏄竴涓潰鍚戝璞′笖鍩轟簬緗戠粶鐨勭▼搴忓紑鍙戞柟娉曡銆傛牴鎹?/span>Rational(Rational Rose鍜岀粺涓寤烘ā璇█鐨勫紑鍙戣?/span>)鐨勮娉曪紝濂藉儚涓涓湪綰跨殑鎸囧鑰咃紝瀹冨彲浠ヤ負鎵鏈夋柟闈㈠拰灞傛鐨勭▼搴忓紑鍙戞彁渚涙寚瀵兼柟閽堬紝妯$増浠ュ強浜嬩緥鏀寔銆?/span> RUP鍜岀被浼肩殑浜у搧--渚嬪闈㈠悜瀵硅薄鐨勮蔣浠惰繃紼嬶紙OOSP錛夛紝浠ュ強OPEN Process閮芥槸鐞嗚В鎬х殑杞歡宸ョ▼宸ュ叿--鎶婂紑鍙戜腑闈㈠悜榪囩▼鐨勬柟闈紙渚嬪瀹氫箟鐨勯樁孌碉紝鎶鏈拰瀹炶返錛夊拰鍏朵粬寮鍙戠殑緇勪歡錛堜緥濡傛枃妗o紝妯″瀷錛屾墜鍐屼互鍙婁唬鐮佺瓑絳夛級鏁村悎鍦ㄤ竴涓粺涓鐨勬鏋跺唴銆?/span>
鎶撳叾綺鵑珦灝辨槸浣挎暣涓紑鍙戣繃紼嬬粺涓錛屽彲綆$悊銆傜敤渚嬮┍鍔紝浠ユ灦鏋勪負涓績錛屽閲忎笌榪唬錛屾槸RUP鐨勪富瑕佹濇兂銆?/span>RUP鏄竴涓緢澶嶆潅鐨勮繃紼嬶紝浣嗗ソ鍦ㄥ畠鍦ㄦ瘡涓」鐩腑浣跨敤鏃跺彲浠ュ洜鍦板埗瀹滐紝鏈夋晥鐨勮鍑忓彲浠ヤ嬌RUP鍦ㄥ伐紼嬩腑鍙戞尌鏈澶х殑濞佸姏銆備綔涓轟竴涓▼搴忓憳錛屾垜棣栧厛瑕佸叧蹇冪殑鏄湁鍏充唬鐮佹灦鏋勭殑闂錛?/span>RUP鏈変竴涓牳蹇冪殑鎬濇兂Separate concern錛屼篃灝辨槸鍒嗙鍏蟲敞鐐廣傝繖涔熷垰濂戒綋鐜頒簡闈㈠悜瀵硅薄鐨勪竴涓濇兂錛氳В鑰︺傞偅涔?/span>RUP涓渶鑳戒綋鐜板畠Separate concern鐨勫簲璇ュ氨綆楀畠鐨?/span>Minimal鍜?/span>Extension浜嗭紝褰撶劧榪樻湁涓浜涘叾瀹冪殑浣撶幇鏂瑰紡錛屾垜浼氬湪涓嬬瘒瀹炰緥涓緇嗕粙緇嶃?/span>
綆鍗曟潵璇?/span>Minimal鎸囩殑鏄偅浜涗笂涓嶄緷璧栦簬琛ㄧ幇灞傦紝涓嬩笉渚濊禆浜庢暟鎹簱錛屾搷浣滅郴緇熺瓑,鍙互鍦ㄤ換浣曠幆澧冧笅榪愯鐨勭函涓氬姟閫昏緫紼嬪簭錛屾渶涓昏鐨勮繕鏄?/span>Minimal閮ㄥ垎鐨勪唬鐮佸彲浠ュ鐢ㄣ?/span>Extension鍖呮嫭Minimal錛屽畠渚濊禆浜庢煇涓壒瀹氱殑搴曞眰紼嬪簭鎴栬呮搷浣滅郴緇熴?/span>Minimal鍜?/span>Extension綾諱技浜庡浘2鐨勫叧緋匯?br>
鍥?