浜屻?絳栫暐妯″紡鐨勭粨鏋?/strong>
絳栫暐妯″紡鏄綆楁硶鐨勫寘瑁咃紝鏄妸浣跨敤綆楁硶鐨勮矗浠誨拰綆楁硶鏈韓鍒嗗壊寮錛屽媧劇粰涓嶅悓鐨勫璞$鐞嗐傜瓥鐣ユā寮忛氬父鎶婁竴涓郴鍒楃殑綆楁硶鍖呰鍒頒竴緋誨垪鐨勭瓥鐣ョ被閲岄潰錛屼綔涓轟竴涓娊璞$瓥鐣ョ被鐨勫瓙綾匯傜敤涓鍙ヨ瘽鏉ヨ錛屽氨鏄細"鍑嗗涓緇勭畻娉曪紝騫跺皢姣忎竴涓畻娉曞皝瑁呰搗鏉ワ紝浣垮緱瀹冧滑鍙互浜掓崲銆?
絳栫暐鍙堢О鍋氭斂絳栵紙Policy錛夋ā寮忋怗OF95銆戙備笅闈㈡槸涓涓ず鎰忔х殑絳栫暐妯″紡緇撴瀯鍥撅細

榪欎釜妯″紡娑夊強鍒頒笁涓鑹詫細
* 鐜錛圕ontext錛夎鑹詫細鎸佹湁涓涓猄trategy綾葷殑寮曠敤銆?br />
* 鎶借薄絳栫暐錛圫trategy錛夎鑹詫細榪欐槸涓涓娊璞¤鑹詫紝閫氬父鐢變竴涓帴鍙f垨鎶借薄綾誨疄鐜般傛瑙掕壊緇欏嚭鎵鏈夌殑鍏蜂綋絳栫暐綾繪墍闇鐨勬帴鍙c?br />
* 鍏蜂綋絳栫暐錛圕oncreteStrategy錛夎鑹詫細鍖呰浜嗙浉鍏崇殑綆楁硶鎴栬涓恒?br />
涓夈?紺烘剰鎬ф簮浠g爜
//鎶借薄絳栫暐
abstract class Strategy {
public abstract void AlgorithmInterface();
}
//鍏蜂綋鐨勭瓥鐣ョ畻娉旳
class ConcreteStrategyA extends Strategy{
@Override public void AlgorithmInterface(){
System.out.println ("浣跨敤絳栫暐A");
}
}
//鍏蜂綋鐨勭瓥鐣ョ畻娉旴
class ConcreteStrategyB extends Strategy{
@Override public void AlgorithmInterface(){
System.out.println ("浣跨敤絳栫暐B");
}
}
//鐜
class Context{
Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public void contextInterface(){
strategy.AlgorithmInterface();
}
//鏀瑰彉絳栫暐
public void setStratery(Strategy strategy){
this.strategy = strategy;
}
}
//嫻嬭瘯
public class Client{
public static void main (String[] args) {
Context c = new Context(new ConcreteStrategyA());
c.contextInterface();
//鍙互寰堟柟渚垮湴鏀瑰彉絳栫暐錛岃屼笉蹇呬慨鏀瑰師鏉ョ殑浠g爜
c.setStratery(new ConcreteStrategyB());
c.contextInterface();
}
}
/*杈撳嚭錛?br />
浣跨敤絳栫暐A
浣跨敤絳栫暐B
*/
鍥涖?浣曟椂浣跨敤浣曠鍏蜂綋絳栫暐瑙掕壊
鍦ㄥ涔犵瓥鐣ユā寮忔椂錛屽鍛樺父闂殑涓涓棶棰樻槸錛氫負浠涔堜笉鑳戒粠絳栫暐妯″紡涓湅鍑哄摢涓涓叿浣撶瓥鐣ラ傜敤浜庡摢涓縐嶆儏鍐靛憿錛?br />
絳旀闈炲父綆鍗曪紝絳栫暐妯″紡騫朵笉璐熻矗鍋氳繖涓喅瀹氥傛崲璦涔嬶紝搴斿綋鐢卞鎴風鑷繁鍐沖畾鍦ㄤ粈涔堟儏鍐典笅浣跨敤浠涔堝叿浣撶瓥鐣ヨ鑹層傜瓥鐣ユā寮忎粎浠呭皝瑁呯畻娉曪紝鎻愪緵鏂扮畻娉曟彃鍏ュ埌宸叉湁緋葷粺涓紝浠ュ強鑰佺畻娉曚粠緋葷粺涓?閫浼?鐨勬柟渚匡紝絳栫暐妯″紡騫朵笉鍐沖畾鍦ㄤ綍鏃朵嬌鐢ㄤ綍縐嶇畻娉曘?br />
浜斻?涓涓疄闄呭簲鐢ㄧ瓥鐣ユā寮忕殑渚嬪瓙
涓嬮潰鐨勪緥瀛愬埄鐢ㄧ瓥鐣ユā寮忓湪鎺掑簭瀵硅薄涓皝瑁呬簡涓嶅悓鐨勬帓搴忕畻娉曪紝榪欐牱浠ヤ究鍏佽瀹㈡埛绔姩鎬佺殑鏇挎崲鎺掑簭絳栫暐錛堝寘鎷琎uicksort銆丼hellsort鍜孧ergesort錛夈?br />
import java.util.ArrayList;
//鎶芥帓搴忚薄絳栫暐
abstract class SortStrategy{
abstract public void sort(ArrayList list);
}
//蹇帓絳栫暐
class QuickSort extends SortStrategy{
@Override public void sort(ArrayList list){
System.out.println ("QuickSorted list");
}
}
//甯屽皵鎺掑簭絳栫暐
class ShellSort extends SortStrategy{
@Override public void sort(ArrayList list){
System.out.println ("ShellSorted list");
}
}
//褰掑茍鎺掑簭絳栫暐
class MergeSort extends SortStrategy{
@Override public void sort(ArrayList list){
System.out.println ("MergeSort list");
}
}
//鐜
class SortedList{
private ArrayList list = new ArrayList();
private SortStrategy sortStrategy;
public SortedList(SortStrategy sortStrategy){
this.sortStrategy = sortStrategy;
}
public void sort(){
sortStrategy.sort(list);
}
//鏀瑰彉絳栫暐
public void setStrategy(SortStrategy sortStrategy){
this.sortStrategy = sortStrategy;
}
}
//嫻嬭瘯
public class StrategyApp {
public static void main (String[] args) {
SortedList studentRecords = new SortedList(new QuickSort());
studentRecords.sort();
//鏀圭敤甯屽皵鎺掑簭
studentRecords.setStrategy(new ShellSort());
studentRecords.sort();
}
}
/*杈撳嚭錛?br />
QuickSorted list
ShellSorted list
*/
鍏?鍦ㄤ粈涔堟儏鍐典笅搴斿綋浣跨敤絳栫暐妯″紡
鍦ㄤ笅闈㈢殑鎯呭喌涓嬪簲褰撹冭檻浣跨敤絳栫暐妯″紡錛?br />
1. 濡傛灉鍦ㄤ竴涓郴緇熼噷闈㈡湁璁稿綾伙紝瀹冧滑涔嬮棿鐨勫尯鍒粎鍦ㄤ簬瀹冧滑鐨勮涓猴紝閭d箞浣跨敤絳栫暐妯″紡鍙互鍔ㄦ佸湴璁╀竴涓璞″湪璁稿琛屼負涓夋嫨涓縐嶈涓恒?br />
2. 涓涓郴緇熼渶瑕佸姩鎬佸湴鍦ㄥ嚑縐嶇畻娉曚腑閫夋嫨涓縐嶃傞偅涔堣繖浜涚畻娉曞彲浠ュ寘瑁呭埌涓涓釜鐨勫叿浣撶畻娉曠被閲岄潰錛岃岃繖浜涘叿浣撶畻娉曠被閮芥槸涓涓娊璞$畻娉曠被鐨勫瓙綾匯傛崲璦涔嬶紝榪欎簺鍏蜂綋綆楁硶綾誨潎鏈夌粺涓鐨勬帴鍙o紝鐢變簬澶氭佹у師鍒欙紝瀹㈡埛绔彲浠ラ夋嫨浣跨敤浠諱綍涓涓叿浣撶畻娉曠被錛屽茍鍙寔鏈変竴涓暟鎹被鍨嬫槸鎶借薄綆楁硶綾葷殑瀵硅薄銆?br />
3. 涓涓郴緇熺殑綆楁硶浣跨敤鐨勬暟鎹笉鍙互璁╁鎴風鐭ラ亾銆傜瓥鐣ユā寮忓彲浠ラ伩鍏嶈瀹㈡埛绔秹鍙婂埌涓嶅繀瑕佹帴瑙﹀埌鐨勫鏉傜殑鍜屽彧涓庣畻娉曟湁鍏崇殑鏁版嵁銆?br />
4. 濡傛灉涓涓璞℃湁寰堝鐨勮涓猴紝濡傛灉涓嶇敤鎭板綋鐨勬ā寮忥紝榪欎簺琛屼負灝卞彧濂戒嬌鐢ㄥ閲嶇殑鏉′歡閫夋嫨璇彞鏉ュ疄鐜般傛鏃訛紝浣跨敤絳栫暐妯″紡錛屾妸榪欎簺琛屼負杞Щ鍒扮浉搴旂殑鍏蜂綋絳栫暐綾婚噷闈紝灝卞彲浠ラ伩鍏嶄嬌鐢ㄩ毦浠ョ淮鎶ょ殑澶氶噸鏉′歡閫夋嫨璇彞錛屽茍浣撶幇闈㈠悜瀵硅薄璁捐鐨勬蹇點?br />
涓冦?絳栫暐妯″紡鐨勪紭鐐瑰拰緙虹偣
絳栫暐妯″紡鏈夊緢澶氫紭鐐瑰拰緙虹偣銆傚畠鐨勪紭鐐規湁錛?br />
1. 絳栫暐妯″紡鎻愪緵浜嗙鐞嗙浉鍏崇殑綆楁硶鏃忕殑鍔炴硶銆傜瓥鐣ョ被鐨勭瓑綰х粨鏋勫畾涔変簡涓涓畻娉曟垨琛屼負鏃忋傛伆褰撲嬌鐢ㄧ戶鎵垮彲浠ユ妸鍏叡鐨勪唬鐮佺Щ鍒扮埗綾婚噷闈紝浠庤岄伩鍏嶉噸澶嶇殑浠g爜銆?br />
2. 絳栫暐妯″紡鎻愪緵浜嗗彲浠ユ浛鎹㈢戶鎵垮叧緋葷殑鍔炴硶銆傜戶鎵垮彲浠ュ鐞嗗縐嶇畻娉曟垨琛屼負銆傚鏋滀笉鏄敤絳栫暐妯″紡錛岄偅涔堜嬌鐢ㄧ畻娉曟垨琛屼負鐨勭幆澧冪被灝卞彲鑳戒細鏈変竴浜涘瓙綾伙紝姣忎竴涓瓙綾繪彁渚涗竴涓笉鍚岀殑綆楁硶鎴栬涓恒備絾鏄紝榪欐牱涓鏉ョ畻娉曟垨琛屼負鐨勪嬌鐢ㄨ呭氨鍜岀畻娉曟垨琛屼負鏈韓娣峰湪涓璧楓傚喅瀹氫嬌鐢ㄥ摢涓縐嶇畻娉曟垨閲囧彇鍝竴縐嶈涓虹殑閫昏緫灝卞拰綆楁硶鎴栬涓虹殑閫昏緫娣峰悎鍦ㄤ竴璧鳳紝浠庤屼笉鍙兘鍐嶇嫭绔嬫紨鍖栥傜戶鎵夸嬌寰楀姩鎬佹敼鍙樼畻娉曟垨琛屼負鍙樺緱涓嶅彲鑳姐?br />
3. 浣跨敤絳栫暐妯″紡鍙互閬垮厤浣跨敤澶氶噸鏉′歡杞Щ璇彞銆傚閲嶈漿縐昏鍙ヤ笉鏄撶淮鎶わ紝瀹冩妸閲囧彇鍝竴縐嶇畻娉曟垨閲囧彇鍝竴縐嶈涓虹殑閫昏緫涓庣畻娉曟垨琛屼負鐨勯昏緫娣峰悎鍦ㄤ竴璧鳳紝緇熺粺鍒楀湪涓涓閲嶈漿縐昏鍙ラ噷闈紝姣斾嬌鐢ㄧ戶鎵跨殑鍔炴硶榪樿鍘熷鍜岃惤鍚庛?br />
絳栫暐妯″紡鐨勭己鐐規湁錛?br />
1. 瀹㈡埛绔繀欏葷煡閬撴墍鏈夌殑絳栫暐綾伙紝騫惰嚜琛屽喅瀹氫嬌鐢ㄥ摢涓涓瓥鐣ョ被銆傝繖灝辨剰鍛崇潃瀹㈡埛绔繀欏葷悊瑙h繖浜涚畻娉曠殑鍖哄埆錛屼互渚塊傛椂閫夋嫨鎭板綋鐨勭畻娉曠被銆傛崲璦涔嬶紝絳栫暐妯″紡鍙傜敤浜庡鎴風鐭ラ亾鎵鏈夌殑綆楁硶鎴栬涓虹殑鎯呭喌銆?br />
2. 絳栫暐妯″紡閫犳垚寰堝鐨勭瓥鐣ョ被銆傛湁鏃跺欏彲浠ラ氳繃鎶婁緷璧栦簬鐜鐨勭姸鎬佷繚瀛樺埌瀹㈡埛绔噷闈紝鑰屽皢絳栫暐綾昏璁℃垚鍙叡浜殑錛岃繖鏍風瓥鐣ョ被瀹炰緥鍙互琚笉鍚屽鎴風浣跨敤銆傛崲璦涔嬶紝鍙互浣跨敤浜厓妯″紡鏉ュ噺灝戝璞$殑鏁伴噺銆?br />
鍏?鍏跺畠
絳栫暐妯″紡涓庡緢澶氬叾瀹冪殑妯″紡閮芥湁鐫騫挎硾鐨勮仈緋匯係trategy寰堝鏄撳拰Bridge妯″紡鐩告販娣嗐傝櫧鐒跺畠浠粨鏋勫緢鐩鎬技錛屼絾瀹冧滑鍗存槸涓鴻В鍐充笉鍚岀殑闂鑰岃璁$殑銆?Strategy妯″紡娉ㄩ噸浜庣畻娉曠殑灝佽錛岃孊ridge妯″紡娉ㄩ噸浜庡垎紱繪娊璞″拰瀹炵幇錛屼負涓涓娊璞′綋緋繪彁渚涗笉鍚岀殑瀹炵幇銆侭ridge妯″紡涓嶴trategy妯″紡閮藉緢濂界殑浣撶幇浜?Favor composite over inheritance"鐨勮鐐廣?br />
鎺ㄨ崘澶у璇諱竴璇匯奍oC 瀹瑰櫒鍜孌ependency Injection 妯″紡銆嬶紝浣滆匨artin Fowler銆傜綉涓婂彲浠ユ壘鍒頒腑鏂囩増鐨凱DF鏂囦歡銆備負絳栫暐妯″紡鐨勫疄鏂芥彁渚涗簡涓涓潪甯稿ソ鐨勬柟妗堛?br />
鍙傝冩枃鐚細
闃庡畯錛屻奐ava涓庢ā寮忋嬶紝鐢靛瓙宸ヤ笟鍑虹増紺?br />
[緹嶿James W. Cooper錛屻奀#璁捐妯″紡銆嬶紝鐢靛瓙宸ヤ笟鍑虹増紺?br />
[緹嶿Alan Shalloway James R. Trott錛屻奃esign Patterns Explained銆嬶紝涓浗鐢靛姏鍑虹増紺?br />
[緹嶿Robert C. Martin錛屻婃晱鎹瘋蔣浠跺紑鍙戯紞鍘熷垯銆佹ā寮忎笌瀹炶返銆嬶紝娓呭崕澶у鍑虹増紺?br />
[緹嶿Don Box, Chris Sells錛屻?NET鏈川璁?絎?鍗鳳細鍏叡璇█榪愯搴撱嬶紝涓浗鐢靛姏鍑虹増紺?br />

]]>