锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
Memento錛堝鏈涘綍錛夋ā寮?/font>
]]>
Stratrgy搴旂敤姣旇緝騫挎硾,姣斿, 鍏徃緇忚惀涓氬姟鍙樺寲鍥? 鍙兘鏈変袱縐嶅疄鐜版柟寮?涓涓槸綰挎潯鏇茬嚎,涓涓槸妗嗗浘(bar),榪欐槸涓ょ綆楁硶,鍙互浣跨敤Strategy瀹炵幇.
榪欓噷浠ュ瓧絎︿覆鏇夸唬涓轟緥, 鏈変竴涓枃浠?鎴戜滑闇瑕佽鍙栧悗,甯屾湜鏇夸唬鍏朵腑鐩稿簲鐨勫彉閲?鐒跺悗杈撳嚭.鍏充簬鏇夸唬鍏朵腑鍙橀噺鐨勬柟娉曞彲鑳芥湁澶氱鏂規(guī)硶,榪欏彇鍐充簬鐢ㄦ埛鐨勮姹?鎵浠ユ垜浠鍑嗗鍑犲鍙橀噺瀛楃鏇夸唬鏂規(guī).
聽
棣栧厛,鎴戜滑寤虹珛涓涓娊璞$被RepTempRule 瀹氫箟涓浜涘叕鐢ㄥ彉閲忓拰鏂規(guī)硶:
public abstract class RepTempRule{ protected String oldString=""; public void setOldString(String oldString){ 銆銆this.oldString=oldString; } protected String newString=""; public String getNewString(){ 銆銆return newString; } public abstract void replace() throws Exception; } |
鍦≧epTempRule涓?鏈変竴涓娊璞℃柟娉昦bstract闇瑕佺戶鎵挎槑紜?榪欎釜replace閲屽叾瀹炴槸鏇夸唬鐨勫叿浣撴柟娉?
鎴戜滑鐜板湪鏈変袱涓瓧絎︽浛浠f柟妗?
1.灝嗘枃鏈腑aaa鏇夸唬鎴恇bb;
2.灝嗘枃鏈腑aaa鏇夸唬鎴恈cc;
瀵瑰簲鐨勭被鍒嗗埆鏄疪epTempRuleOne RepTempRuleTwo
public class RepTempRuleOne extends RepTempRule{ |
public class RepTempRuleTwo extends RepTempRule{ public void replace() throws Exception{ 銆銆newString=oldString.replaceFirst("aaa", "ccc") 銆銆System.out.println("this is replace Two"); 銆銆 } } |
絎簩姝ワ細(xì)鎴戜滑瑕佸緩绔嬩竴涓畻娉曡В鍐崇被錛岀敤鏉ユ彁渚涘鎴風(fēng)鍙互鑷敱閫夋嫨綆楁硶銆?/p>
public class RepTempRuleSolve {
銆銆private RepTempRule strategy; 銆銆public RepTempRuleSolve(RepTempRule rule){ 銆銆public String getNewContext(Site site,String oldString) { 銆銆public void changeAlgorithm(RepTempRule newAlgorithm) { } |
聽
聽
璋冪敤濡備笅:
public class test{ ...... 銆銆public void testReplace(){ 銆銆//浣跨敤絎竴濂楁浛浠f柟妗?br />銆銆RepTempRuleSolve solver=new RepTempRuleSolve(new RepTempRuleSimple()); 銆銆//浣跨敤絎簩濂?/p> 銆銆solver=new RepTempRuleSolve(new RepTempRuleTwo());
銆銆} ..... } |
鎴戜滑杈懼埌浜嗗湪榪愯鏈熼棿錛屽彲浠ヨ嚜鐢卞垏鎹㈢畻娉曠殑鐩殑銆?/p>
瀹為檯鏁翠釜Strategy鐨勬牳蹇冮儴鍒嗗氨鏄娊璞$被鐨勪嬌鐢?浣跨敤Strategy妯″紡鍙互鍦ㄧ敤鎴烽渶瑕佸彉鍖栨椂,淇敼閲忓緢灝?鑰屼笖蹇?
Strategy鍜孎actory鏈変竴瀹氱殑綾諱技,Strategy鐩稿綆鍗曞鏄撶悊瑙?騫朵笖鍙互鍦ㄨ繍琛屾椂鍒昏嚜鐢卞垏鎹€侳actory閲嶇偣鏄敤鏉ュ垱寤哄璞°?/p>
Strategy閫傚悎涓嬪垪鍦哄悎:
1.浠ヤ笉鍚岀殑鏍煎紡淇濆瓨鏂囦歡;
2.浠ヤ笉鍚岀殑綆楁硶鍘嬬緝鏂囦歡;
3.浠ヤ笉鍚岀殑綆楁硶鎴幏鍥捐薄;
4.浠ヤ笉鍚岀殑鏍煎紡杈撳嚭鍚屾牱鏁版嵁鐨勫浘褰?姣斿鏇茬嚎 鎴栨鍥綽ar絳?/p>
鎴戜滑浠ョ被Sample涓轟緥錛?濡傛灉鎴戜滑瑕佸垱寤篠ample鐨勫疄渚嬪璞?
聽Sample sample=new Sample();
鍙槸錛屽疄闄呮儏鍐墊槸錛岄氬父鎴戜滑閮借鍦ㄥ垱寤簊ample瀹炰緥鏃跺仛鐐瑰垵濮嬪寲鐨勫伐浣?姣斿
璧嬪?鏌ヨ鏁版嵁搴撶瓑銆傞鍏堬紝鎴戜滑鎯沖埌鐨勬槸錛屽彲浠ヤ嬌鐢⊿ample鐨勬瀯閫犲嚱鏁幫紝榪欐牱
鐢熸垚瀹炰緥灝卞啓鎴? 聽Sample sample=new Sample(鍙傛暟);
浣嗘槸錛屽鏋滃垱寤簊ample瀹炰緥鏃舵墍鍋氱殑鍒濆鍖栧伐浣滀笉鏄薄璧嬪艱繖鏍風(fēng)畝鍗曠殑浜嬶紝鍙兘
鏄緢闀夸竴孌典唬鐮侊紝濡傛灉涔熷啓鍏ユ瀯閫犲嚱鏁頒腑錛岄偅浣犵殑浠g爜寰堥毦鐪嬩簡錛堝氨闇瑕丷efactor閲嶆暣錛夈?br />涓轟粈涔堣浠g爜寰堥毦鐪嬶紝鍒濆鑰呭彲鑳芥病鏈夎繖縐嶆劅瑙夛紝鎴戜滑鍒嗘瀽濡備笅錛屽垵濮嬪寲宸ヤ綔濡傛灉
鏄緢闀夸竴孌典唬鐮侊紝璇存槑瑕佸仛鐨勫伐浣滃緢澶氾紝灝嗗緢澶氬伐浣滆鍏ヤ竴涓柟娉曚腑錛岀浉褰撲簬灝嗗緢澶氶浮
铔嬫斁鍦ㄤ竴涓瀛愰噷錛屾槸寰堝嵄闄╃殑錛岃繖涔熸槸鏈夎儗浜嶫ava闈㈠悜瀵硅薄鐨勫師鍒欙紝闈㈠悜瀵硅薄鐨?br />灝佽(Encapsulation)鍜屽垎媧?Delegation)鍛婅瘔鎴戜滑錛屽敖閲忓皢闀跨殑浠g爜鍒嗘淳鈥滃垏鍓測濇垚
姣忔錛屽皢姣忔鍐嶁滃皝瑁呪濊搗鏉?鍑忓皯孌靛拰孌典箣闂村伓鍚堣仈緋繪?錛岃繖鏍鳳紝灝變細(xì)灝嗛闄╁垎鏁o紝
浠ュ悗濡傛灉闇瑕佷慨鏀癸紝鍙鏇存敼姣忔錛屼笉浼?xì)鍐嶅彂鐢熺壍涓鍔ㄧ櫨鐨勪簨鎯呫?br />鍦ㄦ湰渚嬩腑錛岄鍏堬紝鎴戜滑闇瑕佸皢鍒涘緩瀹炰緥鐨勫伐浣滀笌浣跨敤瀹炰緥鐨勫伐浣滃垎寮, 涔熷氨鏄錛?br />璁╁垱寤哄疄渚嬫墍闇瑕佺殑澶ч噺鍒濆鍖栧伐浣滀粠Sample鐨勬瀯閫犲嚱鏁頒腑鍒嗙鍑哄幓銆?br />榪欐椂鎴戜滑灝遍渶瑕丗actory宸ュ巶妯″紡鏉ョ敓鎴愬璞′簡錛屼笉鑳藉啀鐢ㄤ笂闈㈢畝鍗昻ew Sample(鍙傛暟)銆?br />榪樻湁,濡傛灉Sample鏈変釜緇ф壙濡侻ySample, 鎸夌収闈㈠悜鎺ュ彛緙栫▼,鎴戜滑闇瑕佸皢Sample鎶借薄鎴愪竴涓?br />鎺ュ彛.鐜板湪Sample鏄帴鍙?鏈変袱涓瓙綾籑ySample 鍜孒isSample .鎴戜滑瑕佸疄渚嬪寲浠栦滑鏃?濡備笅:
Sample mysample=new MySample();
Sample hissample=new HisSample();
闅忕潃欏圭洰鐨勬繁鍏?Sample鍙兘榪樹細(xì)"鐢熷嚭寰堝鍎垮瓙鍑烘潵", 閭d箞鎴戜滑瑕佸榪欎簺鍎垮瓙涓涓釜
瀹炰緥鍖?鏇寸碂緋曠殑鏄?鍙兘榪樿瀵逛互鍓嶇殑浠g爜榪涜淇敼:鍔犲叆鍚庢潵鐢熷嚭鍎垮瓙鐨勫疄渚?榪欏湪浼?br />緇熺▼搴忎腑鏄棤娉曢伩鍏嶇殑.
浣嗗鏋滀綘涓寮濮嬪氨鏈夋剰璇嗕嬌鐢ㄤ簡宸ュ巶妯″紡,榪欎簺楹葷儲灝辨病鏈変簡.
宸ュ巶鏂規(guī)硶
浣犱細(xì)寤虹珛涓涓笓闂ㄧ敓浜ample瀹炰緥鐨勫伐鍘?
public class Factory{
銆銆public static Sample creator(int which){
銆銆//getClass 浜х敓Sample 涓鑸彲浣跨敤鍔ㄦ佺被瑁呰澆瑁呭叆綾匯?br />銆銆if (which==1)
銆銆銆銆return new SampleA();
銆銆else if (which==2)
銆銆銆銆return new SampleB();
銆銆}
}
閭d箞鍦ㄤ綘鐨勭▼搴忎腑,濡傛灉瑕佸疄渚嬪寲Sample鏃?灝變嬌鐢?br />Sample sampleA=Factory.creator(1);
榪欐牱,鍦ㄦ暣涓氨涓嶆秹鍙?qiáng)鍒癝ample鐨勫叿浣撳瓙綾?杈懼埌灝佽鏁堟灉,涔熷氨鍑忓皯閿欒淇敼鐨勬満浼?
榪欎釜鍘熺悊鍙互鐢ㄥ緢閫氫織鐨勮瘽鏉ユ瘮鍠?灝辨槸鍏蜂綋浜嬫儏鍋氬緱瓚婂,瓚婂鏄撹寖閿欒.榪欐瘡涓仛
榪囧叿浣撳伐浣滅殑浜洪兘娣辨湁浣撲細(xì),鐩稿弽,瀹樺仛寰楄秺楂?璇村嚭鐨勮瘽瓚婃娊璞¤秺絎肩粺,鑼冮敊璇彲鑳芥?br />灝辮秺灝?濂借薄鎴戜滑浠庣紪紼嬪簭涓篃鑳芥?zhèn)熷囖Z漢鐢熼亾鐞?鍛靛懙.
浣跨敤宸ュ巶鏂規(guī)硶瑕佹敞鎰忓嚑涓鑹詫紝棣栧厛浣犺瀹氫箟浜у搧鎺ュ彛錛屽涓婇潰鐨凷ample,浜у搧鎺ュ彛
涓嬫湁Sample鎺ュ彛鐨勫疄鐜扮被,濡係ampleA,鍏舵瑕佹湁涓涓猣actory綾伙紝鐢ㄦ潵鐢熸垚浜у搧Sample銆?br />榪涗竴姝ョ◢寰鏉備竴鐐癸紝灝辨槸鍦ㄥ伐鍘傜被涓婅繘琛屾嫇灞曪紝宸ュ巶綾諱篃鏈夌戶鎵垮畠鐨勫疄鐜扮被
concreteFactory浜嗐?br />鎶借薄宸ュ巶
宸ュ巶妯″紡涓湁: 宸ュ巶鏂規(guī)硶(Factory Method) 鎶借薄宸ュ巶(Abstract Factory).
榪欎袱涓ā寮忓尯鍒湪浜庨渶瑕佸垱寤哄璞$殑澶嶆潅紼嬪害涓娿傚鏋滄垜浠垱寤哄璞$殑鏂規(guī)硶鍙樺緱澶嶆潅浜?
濡備笂闈㈠伐鍘傛柟娉曚腑鏄垱寤轟竴涓璞ample,濡傛灉鎴戜滑榪樻湁鏂扮殑浜у搧鎺ュ彛Sample2.
榪欓噷鍋囪錛歋ample鏈変袱涓猚oncrete綾籗ampleA鍜孲amleB錛岃孲ample2涔熸湁涓や釜concrete綾?br />Sample2A鍜孲ampleB2錛岄偅涔堬紝鎴戜滑灝卞皢涓婁緥涓璅actory鍙樻垚鎶借薄綾?灝嗗叡鍚岄儴鍒嗗皝瑁呭湪鎶?br />璞$被涓?涓嶅悓閮ㄥ垎浣跨敤瀛愮被瀹炵幇錛屼笅闈㈠氨鏄皢涓婁緥涓殑Factory鎷撳睍鎴愭娊璞″伐鍘?
public abstract class Factory{
銆銆public abstract Sample creator();
銆銆public abstract Sample2 creator(String name);
}
public class SimpleFactory extends Factory{
銆銆public Sample creator(){
銆銆銆銆.........
銆銆銆銆return new SampleA
銆銆}
銆銆public Sample2 creator(String name){
銆銆銆銆.........
銆銆銆銆return new Sample2A
銆銆}
}
public class BombFactory extends Factory{
銆銆public Sample creator(){
銆銆銆銆......
銆銆銆銆return new SampleB
銆銆}
銆銆public Sample2 creator(String name){
銆銆銆銆......
銆銆銆銆return new Sample2B
銆銆}
}
浠庝笂闈㈢湅鍒頒袱涓伐鍘傚悇鑷敓浜у嚭涓濂桽ample鍜孲ample2,涔熻浣犱細(xì)鐤戦棶錛屼負(fù)浠涔堟垜
涓嶅彲浠ヤ嬌鐢ㄤ袱涓伐鍘傛柟娉曟潵鍒嗗埆鐢熶駭Sample鍜孲ample2?
鎶借薄宸ュ巶榪樻湁鍙﹀涓涓叧閿鐐癸紝鏄洜涓?SimpleFactory鍐咃紝鐢熶駭Sample鍜岀敓浜?br />Sample2鐨勬柟娉曚箣闂存湁涓瀹氳仈緋伙紝鎵浠ユ墠瑕佸皢榪欎袱涓柟娉曟崋緇戝湪涓涓被涓紝榪欎釜宸ュ巶
綾繪湁鍏舵湰韜壒寰侊紝涔熻鍒墮犺繃紼嬫槸緇熶竴鐨勶紝姣斿錛氬埗閫犲伐鑹烘瘮杈冪畝鍗曪紝鎵浠ュ悕縐?br />鍙玈impleFactory銆?br />鍦ㄥ疄闄呭簲鐢ㄤ腑錛屽伐鍘傛柟娉曠敤寰楁瘮杈冨涓浜涳紝鑰屼笖鏄拰鍔ㄦ佺被瑁呭叆鍣ㄧ粍鍚堝湪涓璧峰簲鐢紝
涓句緥
鎴戜滑浠ive鐨凢orumFactory涓轟緥錛岃繖涓緥瀛愬湪鍓嶉潰鐨凷ingleton妯″紡涓垜浠璁鴻繃錛?br />鐜板湪鍐嶈璁哄叾宸ュ巶妯″紡:
public abstract class ForumFactory {
銆銆private static Object initLock = new Object();
銆銆private static String className = "com.jivesoftware.forum.database.DbForumFactory";
銆銆private static ForumFactory factory = null;
銆銆public static ForumFactory getInstance(Authorization authorization) {
銆銆銆銆//If no valid authorization passed in, return null.
銆銆銆銆if (authorization == null) {
銆銆銆銆銆銆return null;
銆銆銆銆}
銆銆銆銆//浠ヤ笅浣跨敤浜哠ingleton 鍗曟佹ā寮?br />銆銆銆銆if (factory == null) {
銆銆銆銆銆銆synchronized(initLock) {
銆銆銆銆銆銆銆銆if (factory == null) {
銆銆銆銆銆銆銆銆銆銆銆銆......
銆銆銆銆銆銆銆銆銆銆try {
銆銆銆銆銆銆銆銆銆銆銆銆銆銆//鍔ㄦ佽漿杞界被
銆銆銆銆銆銆銆銆銆銆銆銆銆銆Class c = Class.forName(className);
銆銆銆銆銆銆銆銆銆銆銆銆銆銆factory = (ForumFactory)c.newInstance();
銆銆銆銆銆銆銆銆銆銆}
銆銆銆銆銆銆銆銆銆銆catch (Exception e) {
銆銆銆銆銆銆銆銆銆銆銆銆銆銆return null;
銆銆銆銆銆銆銆銆銆銆}
銆銆銆銆銆銆銆銆}
銆銆銆銆銆銆}
銆銆銆銆}
銆銆銆銆//Now, 榪斿洖 proxy.鐢ㄦ潵闄愬埗鎺堟潈瀵筬orum鐨勮闂?br />銆銆銆銆return new ForumFactoryProxy(authorization, factory,
銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆factory.getPermissions(authorization));
銆銆}
銆銆//鐪熸鍒涘緩forum鐨勬柟娉曠敱緇ф壙forumfactory鐨勫瓙綾誨幓瀹屾垚.
銆銆public abstract Forum createForum(String name, String description)
銆銆throws UnauthorizedException, ForumAlreadyExistsException;
銆銆....
}
鍥犱負(fù)鐜板湪鐨凧ive鏄氳繃鏁版嵁搴撶郴緇熷瓨鏀捐鍧涘笘瀛愮瓑鍐呭鏁版嵁,濡傛灉甯屾湜鏇存敼涓洪氳繃鏂囦歡緋葷粺瀹炵幇,榪欎釜宸ュ巶鏂規(guī)硶ForumFactory灝辨彁渚涗簡鎻愪緵鍔ㄦ佹帴鍙?
private static String className = "com.jivesoftware.forum.database.DbForumFactory";
浣犲彲浠ヤ嬌鐢ㄨ嚜宸卞紑鍙戠殑鍒涘緩forum鐨勬柟娉曚唬鏇縞om.jivesoftware.forum.database.DbForumFactory灝卞彲浠?
鍦ㄤ笂闈㈢殑涓孌典唬鐮佷腑涓鍏辯敤浜嗕笁縐嶆ā寮?闄や簡宸ュ巶妯″紡澶?榪樻湁Singleton鍗曟佹ā寮?浠ュ強(qiáng)proxy妯″紡,proxy妯″紡涓昏鐢ㄦ潵鎺堟潈鐢ㄦ埛瀵筬orum鐨勮闂?鍥犱負(fù)璁塊棶forum鏈変袱縐嶄漢:涓涓槸娉ㄥ唽鐢ㄦ埛 涓涓槸娓稿guest,閭d箞閭d箞鐩稿簲鐨勬潈闄愬氨涓嶄竴鏍?鑰屼笖榪欎釜鏉冮檺鏄瘡絀挎暣涓郴緇熺殑,鍥犳寤虹珛涓涓猵roxy,綾諱技緗戝叧鐨勬蹇?鍙互寰堝ソ鐨勮揪鍒拌繖涓晥鏋?聽
鐪嬬湅Java瀹犵墿搴椾腑鐨凜atalogDAOFactory:
public class CatalogDAOFactory {
銆銆/**
銆銆* 鏈柟娉曞埗瀹氫竴涓壒鍒殑瀛愮被鏉ュ疄鐜癉AO妯″紡銆?br />銆銆* 鍏蜂綋瀛愮被瀹氫箟鏄湪J2EE鐨勯儴緗叉弿榪板櫒涓?br />銆銆*/
銆銆public static CatalogDAO getDAO() throws CatalogDAOSysException {
銆銆銆銆CatalogDAO catDao = null;
銆銆銆銆try {
銆銆銆銆銆銆InitialContext ic = new InitialContext();
銆銆銆銆銆銆//鍔ㄦ佽鍏ATALOG_DAO_CLASS
銆銆銆銆銆銆//鍙互瀹氫箟鑷繁鐨凜ATALOG_DAO_CLASS錛屼粠鑰屽湪鏃犻渶鍙樻洿澶浠g爜
銆銆銆銆銆銆//鐨勫墠鎻愪笅錛屽畬鎴愮郴緇熺殑宸ㄥぇ鍙樻洿銆?/p>
銆銆銆銆銆銆String className =(String) ic.lookup(JNDINames.CATALOG_DAO_CLASS);
銆銆銆銆銆銆catDao = (CatalogDAO) Class.forName(className).newInstance();
銆銆銆銆} catch (NamingException ne) {
銆銆銆銆銆銆throw new CatalogDAOSysException("
銆銆銆銆銆銆銆銆CatalogDAOFactory.getDAO: NamingException while
銆銆銆銆銆銆銆銆銆銆getting DAO type : \n" + ne.getMessage());
銆銆銆銆} catch (Exception se) {
銆銆銆銆銆銆throw new CatalogDAOSysException("
銆銆銆銆銆銆銆銆CatalogDAOFactory.getDAO: Exception while getting
銆銆銆銆銆銆銆銆銆銆DAO type : \n" + se.getMessage());
銆銆銆銆}
銆銆銆銆return catDao;
銆銆}
}
CatalogDAOFactory鏄吀鍨嬬殑宸ュ巶鏂規(guī)硶錛宑atDao鏄氳繃鍔ㄦ佺被瑁呭叆鍣╟lassName鑾峰緱CatalogDAOFactory鍏蜂綋瀹炵幇瀛愮被錛岃繖涓疄鐜板瓙綾誨湪Java瀹犵墿搴楁槸鐢ㄦ潵鎿嶄綔catalog鏁版嵁搴擄紝鐢ㄦ埛鍙互鏍規(guī)嵁鏁版嵁搴撶殑綾誨瀷涓嶅悓錛屽畾鍒惰嚜宸辯殑鍏蜂綋瀹炵幇瀛愮被錛屽皢鑷繁鐨勫瓙綾誨悕緇欎笌CATALOG_DAO_CLASS鍙橀噺灝卞彲浠ャ?/p>
鐢辨鍙錛屽伐鍘傛柟娉曠‘瀹炰負(fù)緋葷粺緇撴瀯鎻愪緵浜嗛潪甯哥伒媧誨己澶х殑鍔ㄦ佹墿灞曟満鍒訛紝鍙鎴戜滑鏇存崲涓涓嬪叿浣撶殑宸ュ巶鏂規(guī)硶錛岀郴緇熷叾浠栧湴鏂規(guī)棤闇涓鐐瑰彉鎹紝灝辨湁鍙兘灝嗙郴緇熷姛鑳借繘琛屾敼澶存崲闈㈢殑鍙樺寲銆?/p>
璁捐妯″紡濡備綍鍦ㄥ叿浣撻」鐩腑搴旂敤瑙併奐ava瀹炵敤緋葷粺寮鍙戞寚鍗椼?/p>