Composite姣旇緝瀹規槗鐞嗚В錛屾兂鍒癈omposite灝卞簲璇ユ兂鍒版爲褰㈢粨鏋勫浘銆傜粍鍚堜綋鍐呰繖浜涘璞¢兘鏈夊叡鍚屾帴鍙?褰撶粍鍚堜綋涓€涓璞$殑鏂規硶琚皟鐢ㄦ墽琛屾椂錛孋omposite灝嗛亶鍘?Iterator)鏁翠釜鏍戝艦緇撴瀯,瀵繪壘鍚屾牱鍖呭惈榪欎釜鏂規硶鐨勫璞″茍瀹炵幇璋冪敤鎵ц銆傚彲浠ョ敤鐗典竴鍔ㄧ櫨鏉ュ艦瀹廣€?/p>
鎵€浠omposite妯″紡浣跨敤鍒癐terator妯″紡錛屽拰Chain of Responsibility妯″紡綾諱技銆?/p>
Composite濂藉:
1.浣垮鎴風璋冪敤綆€鍗曪紝瀹㈡埛绔彲浠ヤ竴鑷寸殑浣跨敤緇勫悎緇撴瀯鎴栧叾涓崟涓璞★紝鐢ㄦ埛灝變笉蹇呭叧緋昏嚜宸卞鐞嗙殑鏄崟涓璞¤繕鏄暣涓粍鍚堢粨鏋勶紝榪欏氨綆€鍖栦簡瀹㈡埛绔唬鐮併€?br />2.鏇村鏄撳湪緇勫悎浣撳唴鍔犲叆瀵硅薄閮ㄤ歡. 瀹㈡埛绔笉蹇呭洜涓哄姞鍏ヤ簡鏂扮殑瀵硅薄閮ㄤ歡鑰屾洿鏀逛唬鐮併€?/p>
濡備綍浣跨敤Composite?
棣栧厛瀹氫箟涓€涓帴鍙f垨鎶借薄綾伙紝榪欐槸璁捐妯″紡閫氱敤鏂瑰紡浜嗭紝鍏朵粬璁捐妯″紡瀵規帴鍙e唴閮ㄥ畾涔夐檺鍒朵笉澶氾紝Composite鍗存湁涓瀹氾紝閭e氨鏄鍦ㄦ帴鍙e唴閮ㄥ畾涔変竴涓敤浜庤闂拰綆$悊Composite緇勫悎浣撶殑瀵硅薄浠紙鎴栫О閮ㄤ歡Component錛?
涓嬮潰鐨勪唬鐮佹槸浠ユ娊璞$被瀹氫箟錛屼竴鑸敖閲忕敤鎺ュ彛interface,
public abstract class Equipment { 銆€銆€private String name; 銆€銆€//瀹炰環 銆€銆€public abstract double netPrice(); 銆€銆€//鎶樻墸浠鋒牸 銆€銆€public abstract double discountPrice(); 銆€銆€//澧炲姞閮ㄤ歡鏂規硶銆€銆€ 銆€銆€public boolean add(Equipment equipment) { return false; } 銆€銆€//鍒犻櫎閮ㄤ歡鏂規硶 銆€銆€public boolean remove(Equipment equipment) { return false; } 銆€銆€//娉ㄦ剰榪欓噷錛岃繖閲屽氨鎻愪緵涓€縐嶇敤浜庤闂粍鍚堜綋綾葷殑閮ㄤ歡鏂規硶銆?br />銆€銆€public Iterator iter() { return null; } 銆€銆€ 銆€銆€public Equipment(final String name) { this.name=name; } } |
鎶借薄綾籈quipment灝辨槸Component瀹氫箟錛屼唬琛ㄧ潃緇勫悎浣撶被鐨勫璞′滑,Equipment涓畾涔夊嚑涓叡鍚岀殑鏂規硶銆?/p>
public class Disk extends Equipment { 銆€銆€public Disk(String name) { super(name); } 銆€銆€//瀹氫箟Disk瀹炰環涓? 銆€銆€public double netPrice() { return 1.; } 銆€銆€//瀹氫箟浜哾isk鎶樻墸浠鋒牸鏄?.5 瀵規姌銆?br />銆€銆€public double discountPrice() { return .5; } } |
Disk鏄粍鍚堜綋鍐呯殑涓€涓璞★紝鎴栫О涓€涓儴浠訛紝榪欎釜閮ㄤ歡鏄釜鍗曠嫭鍏冪礌( Primitive)銆?br />榪樻湁涓€縐嶅彲鑳芥槸錛屼竴涓儴浠朵篃鏄竴涓粍鍚堜綋錛屽氨鏄榪欎釜閮ㄤ歡涓嬮潰榪樻湁'鍎垮瓙'錛岃繖鏄爲褰㈢粨鏋勪腑閫氬父鐨勬儏鍐碉紝搴旇姣旇緝瀹規槗鐞嗚В銆傜幇鍦ㄦ垜浠厛瑕佸畾涔夎繖涓粍鍚堜綋錛?/p>
abstract class CompositeEquipment extends Equipment 銆€銆€//娉ㄦ剰榪欓噷錛岃繖閲屽氨鎻愪緵鐢ㄤ簬璁塊棶鑷繁緇勫悎浣撳唴鐨勯儴浠舵柟娉曘€?br />銆€銆€//涓婇潰disk 涔嬫墍浠ユ病鏈夛紝鏄洜涓篋isk鏄釜鍗曠嫭(Primitive)鐨勫厓绱? |
涓婇潰CompositeEquipment緇ф壙浜咵quipment,鍚屾椂涓鴻嚜宸遍噷闈㈢殑瀵硅薄浠彁渚涗簡澶栭儴璁塊棶鐨勬柟娉?閲嶈澆浜咺terator,Iterator鏄疛ava鐨凜ollection鐨勪竴涓帴鍙o紝鏄疘terator妯″紡鐨勫疄鐜?涓€鑸病蹇呰閲嶈澆Iterator銆?/font>
鎴戜滑鍐嶇湅鐪婥ompositeEquipment鐨勪袱涓叿浣撶被:鐩樼洅Chassis鍜岀瀛怌abinet錛岀瀛愰噷闈㈠彲浠ユ斁寰堝涓滆タ錛屽搴曟澘錛岀數婧愮洅錛岀‖鐩樼洅絳夛紱鐩樼洅閲岄潰鍙互鏀句竴浜涘皬璁懼錛屽紜洏 杞┍絳夈€傛棤鐤戣繖涓や釜閮芥槸灞炰簬緇勫悎浣撴€ц川鐨勩€?/p>
public class Chassis extends CompositeEquipment { 銆€銆€ public Chassis(String name) { super(name); } 銆€銆€ public double netPrice() { return 1.+super.netPrice(); } 銆€銆€ public double discountPrice() { return .5+super.discountPrice(); } } public class Cabinet extends CompositeEquipment |
鑷蟲鎴戜滑瀹屾垚浜嗘暣涓狢omposite妯″紡鐨勬灦鏋勩€?/p>
鎴戜滑鍙互鐪嬬湅瀹㈡埛绔皟鐢–omposote浠g爜:
Cabinet cabinet=new Cabinet("Tower");
Chassis chassis=new Chassis("PC Chassis");
//灝哖C Chassis瑁呭埌Tower涓?(灝嗙洏鐩掕鍒扮瀛愰噷)
cabinet.add(chassis);
//灝嗕竴涓?0GB鐨勭‖鐩樿鍒?PC Chassis (灝嗙‖鐩樿鍒扮洏鐩掗噷)
chassis.add(new Disk("10 GB"));
//璋冪敤 netPrice()鏂規硶;
System.out.println("netPrice="+cabinet.netPrice());
System.out.println("discountPrice="+cabinet.discountPrice());
涓婇潰璋冪敤鐨勬柟娉昻etPrice()鎴杁iscountPrice()錛屽疄闄呬笂Composite浣跨敤Iterator閬嶅巻浜嗘暣涓爲褰㈢粨鏋?瀵繪壘鍚屾牱鍖呭惈榪欎釜鏂規硶鐨勫璞″茍瀹炵幇璋冪敤鎵ц.
Composite鏄釜寰堝閥濡欎綋鐜版櫤鎱х殑妯″紡錛屽湪瀹為檯搴旂敤涓紝濡傛灉紕板埌鏍戝艦緇撴瀯錛屾垜浠氨鍙互灝濊瘯鏄惁鍙互浣跨敤榪欎釜妯″紡銆?/p>
浠ヨ鍧涗負渚嬶紝涓€涓増(forum)涓湁寰堝甯栧瓙(message),榪欎簺甯栧瓙鏈夊師濮嬭創錛屾湁瀵瑰師濮嬭創鐨勫洖搴旇創錛屾槸涓吀鍨嬬殑鏍戝艦緇撴瀯錛岄偅涔堝綋鐒跺彲浠ヤ嬌鐢–omposite妯″紡錛岄偅涔堟垜浠繘鍏ive涓湅鐪嬶紝鏄浣曞疄鐜扮殑.
Jive瑙e墫
鍦↗ive涓?ForumThread鏄疐orumMessages鐨勫鍣╟ontainer(緇勫悎浣?.涔熷氨鏄錛孎orumThread綾諱技鎴戜滑涓婁緥涓殑 CompositeEquipment.瀹冨拰messages鐨勫叧緋誨鍥撅細
[thread]
銆€銆€ |- [message]
銆€銆€ |- [message]
銆€銆€ 銆€銆€ |- [message]
銆€銆€ 銆€銆€ |- [message]
銆€銆€ 銆€銆€ 銆€銆€ |- [message]
鎴戜滑鍦‵orumThread鐪嬪埌濡備笅浠g爜錛?br />
public interface ForumThread { 銆€銆€ .... 銆€銆€ public void addMessage(ForumMessage parentMessage, ForumMessage newMessage) 銆€銆€ 銆€銆€ 銆€銆€ throws UnauthorizedException; 銆€銆€ public void deleteMessage(ForumMessage message) 銆€銆€ } |
綾諱技CompositeEquipment, 鎻愪緵鐢ㄤ簬璁塊棶鑷繁緇勫悎浣撳唴鐨勯儴浠舵柟娉? 澧炲姞 鍒犻櫎 閬嶅巻.
錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞
聽聽聽 Composite妯″紡鐨勬剰鍥炬槸鈥滃皢瀵硅薄緇勫悎鎴愭爲褰㈢粨鏋勮〃紺衡€樻暣浣?閮ㄥ垎鈥欑殑灞傛緇撴瀯銆侰omposite浣垮緱鐢ㄦ埛瀵瑰崟涓璞″拰緇勫悎瀵硅薄鐨勪嬌鐢ㄦ洿鍏鋒湁涓€鑷存€р€濄€?/p>
聽聽聽 鍦╓ord涓垜浠粡甯鎬細灝嗕竴浜涘浘鍏冭繘琛屸€滅粍鍚堚€濓紝緇勫悎浠ュ悗鐨勫浘褰㈣繕鍙互鍚戠畝鍗曞浘鍏冮偅鏍瘋繘琛岀Щ鍔ㄣ€佸彉褰㈢瓑絳夋搷浣滐紱闄ゆ浠ュ錛屽湪Word涓紝鎴戜滑瀵逛簬涓€涓瓧絎︺€佷竴涓瘝緇勩€佷竴鍙ヨ瘽銆佷竴涓钀斤紝鐢氳嚦鏄暣綃囨枃绔犵殑鎿嶄綔鏄浉鍚岀殑錛屾垜浠兘鍙互榪涜鍓垏銆佸鍒訛紝榪涜瀛椾綋涓庡ぇ灝忕殑璋冩暣錛岃繘琛岄鑹茬殑鍙樻崲銆傝繖浜涗緥瀛愰兘鏄疌omposite妯″紡鐨勫疄渚嬶紝鎴戜滑灝嗙畝鍗曠殑鍏冪礌緇勫悎鎴愬鏉傜殑鍏冪礌錛岀劧鍚庤繕鍙互鍍忔搷浣滅畝鍗曞厓绱犻偅鏍鋒搷浣滅粍鍚堝厓绱犮€?/p>
聽聽聽 Composite妯″紡灝嗗瓙鍏冪礌緇勭粐鎴愭爲鍨嬶紝瀹為檯涓婏紝緇勭粐鎴愬浘鍨嬩篃娌℃湁闂銆傜敤鎴鋒€繪槸鍠滄緇勫悎綆€鍗曞厓绱狅紝涓€鏂歸潰錛岀敤鎴峰彲浠ラ€氳繃榪欐牱鐨勭粍鍚堟潵榪涜鎶借薄錛屽彟涓€鏂歸潰錛岀敤鎴峰彲浠ラ€氳繃緇勫悎鍖栫畝綣佺悙鐨勬搷浣溿€侰omposite妯″紡鍦ㄥ悇縐嶅彲瑙嗗寲緙栬緫杞歡涓簲鐢ㄥ緱鏈€涓哄箍娉涖€?/p>
聽聽聽 鍙︿竴浣跨敤Composite鐨勭粡鍏鎬緥瀛愭槸Java鐨凷wing緋葷粺銆傛墍鏈夌殑Swing緇勪歡閮芥槸緇ф壙鑷竴涓彨鍋欽Component鐨勬帴鍙o紝鍥犳錛屾垜浠涓€涓狫Frame鐨勬搷浣滃拰瀵逛竴涓狫Button鐨勬搷浣滄槸涓€鏍風殑銆傝繖鍚屾椂涔熶嬌寰楋紝JFrame鍦ㄧ鐞嗚嚜宸辯殑瀛愬厓绱犳椂錛屽畠涓嶉渶瑕佺煡閬撲粬浠槸涓€涓狫Button榪樻槸涓€涓狫Panel錛屽瀹冩潵璇達紝榪欏彧鏄竴涓狫Component銆?/p>
聽聽聽 瀹炵幇Composite妯″紡鐨勫叧閿槸鑹ソ璁捐鐨勬帴鍙o紝浜轟滑搴旇瀵瑰彲鑳界殑鍏冪礌錛堢畝鍗曠殑銆佺粍鍚堢殑錛夎繘琛屽垎鏋愶紝騫惰璁″嚭閫氱敤鐨勬搷浣溿€傚敖鍙兘鐨勪繚璇佹帴鍙f搷浣滃鎵€鏈夊厓绱犻兘鏄湁鎰忎箟鐨勶紝鍚﹀垯灝卞簲璇ュ皢閭d簺鍙閮ㄥ垎鍏冪礌鏈夋剰涔夌殑鎿嶄綔涓嬫斁鍒板瓙綾諱腑銆?br />
涓轟粈涔堣浣跨敤Proxy?
1.鎺堟潈鏈哄埗
鎴戜滑寮€鍙戜竴涓簲鐢ㄧ郴緇熸椂錛岀敤鎴瘋姹備換浣曢〉闈㈤兘瑕佺粡榪囨潈闄愭帶鍒訛紝鏈€鏃╁紑鍙戠殑鏃跺€欐垜浠父甯稿皝瑁呬竴涓潈闄愰獙璇佹柟娉?/span>,鐒跺悗鍦ㄦ瘡涓?/span>jsp鎴栬€呭搴旂殑servlet涓鍔犵浉鍏充唬鐮侊紝浣嗘槸鐢ㄦ埛瀵規潈闄愮殑闇€姹傚線寰€鏄鍙樼殑錛岃繖鏍蜂竴鏃︽潈闄愰獙璇佹柟娉曞彉鍖栵紙鍙傛暟鍙樺寲錛屽鍔犳柟娉曪級錛屽鏋滃紑鍙戠殑緋葷粺寰堝簽澶х殑璇濓紝鏈夊彲鑳戒綘灝遍渶瑕佷慨鏀瑰嚑鐧句釜jsp欏甸潰鎴栬€?/span>servlet浠g爜銆?br />榪樻湁鎴戜滑甯擱渶瑕佸垽鏂?/span>session鏄惁榪囨湡錛屽鏋滆繃鏈熷氨瑕侀噸鏂扮櫥闄嗙郴緇燂紝濡傛灉姣忎釜欏甸潰鎴栬€?/span>servlet閮借鍔犲垽鏂唬鐮侊紝閭d篃鏄歡姣旇緝鐥涜嫤鐨勪簨鎯呫€?br />濡傛灉鎴戜滑閲囩敤浠g悊妯″紡錛屽鍔?/span>Proxy瀵硅薄錛屾瘡嬈$敤鎴瘋姹傚繀欏婚€氳繃proxy瀵硅薄澶勭悊錛岀敱瀹冧笓闂ㄥ鐞嗙浉鍏蟲潈闄愭帶鍒訛紝涓€鏃︽潈闄愰渶姹傚彉鍖栦簡錛屽彧闇€瑕佷慨鏀?/span>Proxy瀵硅薄鐩稿叧鐨勫疄鐜版柟娉曘€?/span>
2.鏌愪釜瀹㈡埛绔笉鑳界洿鎺ユ搷浣滃埌鏌愪釜瀵硅薄,浣嗗張蹇呴』鍜岄偅涓璞℃湁鎵€浜掑姩.
涓句緥4涓叿浣撴儏鍐?
u 涓€涓璞★紝姣斿涓€騫呭緢澶х殑鍥懼儚錛岄渶瑕佽澆鍏ョ殑鏃墮棿寰堥暱銆?
u 涓€涓渶瑕佸緢闀挎椂闂存墠鍙互瀹屾垚鐨勮綆楃粨鏋滐紝騫朵笖闇€瑕佸湪瀹冭綆楄繃紼嬩腑鏄劇ず涓棿緇撴灉
u 涓€涓瓨鍦ㄤ簬榪滅▼璁$畻鏈轟笂鐨勫璞★紝闇€瑕侀€氳繃緗戠粶杞藉叆榪欎釜榪滅▼瀵硅薄鍒欓渶瑕佸緢闀挎椂闂達紝鐗瑰埆鏄湪緗戠粶浼犺緭楂樺嘲鏈熴€?
u 涓€涓璞″彧鏈夋湁闄愮殑璁塊棶鏉冮檺錛屼唬鐞嗘ā寮?Proxy)鍙互楠岃瘉鐢ㄦ埛鐨勬潈闄?
鎬諱箣鍘熷垯鏄?瀵逛簬寮€閿€寰堝ぇ鐨勫璞?鍙湁鍦ㄤ嬌鐢ㄥ畠鏃舵墠鍒涘緩,榪欎釜鍘熷垯鍙互涓烘垜浠妭鐪佸緢澶氬疂璐電殑Java鍐呭瓨. 鎵€浠?鏈変簺浜鴻涓篔ava鑰楄垂璧勬簮鍐呭瓨,鎴戜互涓鴻繖鍜岀▼搴忕紪鍒舵€濊礬涔熸湁涓€瀹氱殑鍏崇郴.
綆€鍗曞疄渚嬶細
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface AnInterface {
聽public void doSomething();
}
class AClass implements AnInterface {
聽public void doSomething() {
聽聽System.out.println("Inside Method AClass.doSomething()");
聽}
}
class SimpleInvocationHandler implements InvocationHandler {
聽public SimpleInvocationHandler(Object realSubject) {
聽聽this.realSubject = realSubject;
聽}
聽public Object invoke(Object proxy, Method m, Object[] args) {
聽聽Object result = null;
聽聽System.out.println("Before Calling " + m.getName());
聽聽try {
聽聽聽result = m.invoke(realSubject, args);
聽聽} catch (Exception ex) {
聽聽聽System.exit(1);
聽聽}
聽聽System.out.println("After Calling " + m.getName());
聽聽return result;
聽}
聽private Object realSubject = null;
}
public class Test {
聽public static void main(String args[]) {
聽聽AnInterface realSubject = new AClass();
聽聽AnInterface proxy = (AnInterface) Proxy.newProxyInstance(realSubject
聽聽聽聽.getClass().getClassLoader(), realSubject.getClass()
聽聽聽聽.getInterfaces(), new SimpleInvocationHandler(realSubject));
聽聽passMeAProxy(proxy);
聽}
聽private static void passMeAProxy(AnInterface anInterface) {
聽聽anInterface.doSomething();
聽}
}
Prototype妯″紡鍏佽涓€涓璞″啀鍒涘緩鍙﹀涓€涓彲瀹氬埗鐨勫璞★紝鏍規湰鏃犻渶鐭ラ亾浠諱綍濡備綍鍒涘緩鐨勭粏鑺?宸ヤ綔鍘熺悊鏄?閫氳繃灝嗕竴涓師鍨嬪璞′紶緇欓偅涓鍙戝姩鍒涘緩鐨勫璞★紝榪欎釜瑕佸彂鍔ㄥ垱寤虹殑瀵硅薄閫氳繃璇鋒眰鍘熷瀷瀵硅薄鎷瘋礉瀹冧滑鑷繁鏉ュ疄鏂藉垱寤恒€?/p>
濡備綍浣跨敤?
鍥犱負Java涓殑鎻愪緵clone()鏂規硶鏉ュ疄鐜板璞$殑鍏嬮殕,鎵€浠rototype妯″紡瀹炵幇涓€涓嬪瓙鍙樺緱寰堢畝鍗?
浠ュ嫼瀛愪負渚嬶細
public abstract class AbstractSpoon implements Cloneable { 銆€銆€String spoonName; 銆€銆€public void setSpoonName(String spoonName) {this.spoonName = spoonName;} 銆€銆€public String getSpoonName() {return this.spoonName;} 銆€銆€public Object clone() 銆€銆€{ 銆€銆€銆€銆€Object object = null; 銆€銆€銆€銆€try { 銆€銆€銆€銆€銆€銆€object = super.clone(); 銆€銆€銆€銆€} catch (CloneNotSupportedException exception) { 銆€銆€銆€銆€銆€銆€System.err.println("AbstractSpoon is not Cloneable"); 銆€銆€銆€銆€} 銆€銆€銆€銆€return object; 銆€銆€} } |
鏈変釜鍏蜂綋瀹炵幇(ConcretePrototype):
public class SoupSpoon extends AbstractSpoon
|
璋冪敤Prototype妯″紡寰堢畝鍗?
AbstractSpoon spoon = new SoupSpoon();
AbstractSpoon spoon2 = spoon.clone();
褰撶劧涔熷彲浠ョ粨鍚堝伐鍘傛ā寮忔潵鍒涘緩AbstractSpoon瀹炰緥銆?/p>
鍦↗ava涓璓rototype妯″紡鍙樻垚clone()鏂規硶鐨勪嬌鐢紝鐢變簬Java鐨勭函媧佺殑闈㈠悜瀵硅薄鐗規€э紝浣垮緱鍦↗ava涓嬌鐢ㄨ璁℃ā寮忓彉寰楀緢鑷劧錛屼袱鑰呭凡緇忓嚑涔庢槸嫻戠劧涓€浣撲簡銆傝繖鍙嶆槧鍦ㄥ緢澶氭ā寮忎笂錛屽Interator閬嶅巻妯″紡銆?/p>
public class IntegerAdder implements Observer {
private IntegerDataBag bag;
public IntegerAdder( IntegerDataBag bag ) {
this.bag = bag;
bag.addObserver( this );
}
public void update( Subject o ) {
if( o == bag ) {
System.out.println( "The contents of the IntegerDataBag have changed." );
int counter = 0;
Iterator i = bag.iterator();
while( i.hasNext() ) {
Integer integer = ( Integer ) i.next();
counter+=integer.intValue();
}
System.out.println( "The new sum of the integers is: " + counter );
}
}
}
import java.util.Iterator;
public class IntegerPrinter implements Observer {
private IntegerDataBag bag;
public IntegerPrinter( IntegerDataBag bag ) {
this.bag = bag;
bag.addObserver( this );
}
public void update( Subject o ) {
if( o == bag ) {
System.out.println( "The contents of the IntegerDataBag have changed." );
System.out.println( "The new contents of the IntegerDataBag contains:" );
Iterator i = bag.iterator();
while( i.hasNext() ) {
System.out.println( i.next() );
}
}
}
}
IntegerAdder鍜孖ntegerPrinter灝嗚嚜宸變綔涓鴻瀵熻€呭鍔犲埌IntegerDataBag銆傚綋IntegerAdder鎺ユ敹鍒頒竴鏉℃洿鏂版秷鎭椂錛屽畠鍏堢粺璁ag涓殑鎬繪暟錛岀劧鍚庢樉紺虹粨鏋溿€傚悓鏍鳳紝褰揑ntegerPrinter鎺ユ敹鍒頒竴鏉℃洿鏂版秷鎭椂錛屽畠鎵撳嵃鍑篵ag涓殑Interger銆?
涓嬮潰鏄竴涓畝鍗曠殑main()錛屽畠浣跨敤浜嗕笂闈㈢殑鍑犱釜綾伙細
public class Driver {
public static void main( String [] args ) {
Integer i1 = new Integer( 1 ); Integer i2 = new Integer( 2 );
Integer i3 = new Integer( 3 ); Integer i4 = new Integer( 4 );
Integer i5 = new Integer( 5 ); Integer i6 = new Integer( 6 );
Integer i7 = new Integer( 7 ); Integer i8 = new Integer( 8 );
Integer i9 = new Integer( 9 );
IntegerDataBag bag = new IntegerDataBag();
bag.add( i1 ); bag.add( i2 ); bag.add( i3 ); bag.add( i4 );
bag.add( i5 ); bag.add( i6 ); bag.add( i7 ); bag.add( i8 );
IntegerAdder adder = new IntegerAdder( bag );
IntegerPrinter printer = new IntegerPrinter( bag );
// adder and printer add themselves to the bag
System.out.println( "About to add another integer to the bag:" );
bag.add( i9 );
System.out.println("");
System.out.println("About to remove an integer from the bag:");
bag.remove( 0 );
}
}
榪愯main錛屼綘灝嗙湅鍒幫細
c:\javaworld\java Driver
About to add another integer to the bag:
The contents of the IntegerDataBag have changed.
The new sum of the intergers is: 45
The contents of the IntegerDataBag have changed.
The new contents of the IntegerDataBag contains:
1
2
3
4
5
6
7
8
9
About to remove an integer from the bag:
The contents of the IntegerDataBag have changed.
The new sum of the intergers is: 44
The contents of the IntegerDataBag have changed.
The new contents of the IntegerDataBag contains:
2
3
4
5
6
7
8
9
IntegerDataBag/IntegerAdder/IntegerPrinter鏄簲鐢∣bserver妯″紡鐨勪竴涓緢綆€鍗曠殑渚嬪瓙銆侸ava鏈韓鏈夊ぇ閲忎嬌鐢∣bserver妯″紡鐨勪緥瀛愶細AWT/Swing浜嬩歡妯″瀷錛岃繕鏈塲ava.util.Observer鍜宩ava.util.Observable鎺ュ彛絳夛紝閮芥槸寰堝ソ鐨勪緥瀛?br />
銆€銆€ 鎴戜滑鍙互浣跨敤涓€縐嶆洿涓虹伒媧葷殑鏂規硶錛屽氨鏄妸鏂囨湰鍖哄祵鍏ュ埌婊氬姩鏉′腑銆傝€岃繖涓粴鍔ㄦ潯鐨勭被灝辯浉褰撲簬瀵規枃鏈尯鐨勪竴涓?strong>瑁呴グ銆?榪欎釜瑁呴グ(婊氬姩鏉?蹇呴』涓庤瑁呴グ鐨勭粍浠?鏂囨湰鍖?緇ф壙鑷悓涓€涓帴鍙o紝榪欐牱錛岀敤鎴峰氨涓嶅繀鍏沖績瑁呴グ鐨勫疄鐜幫紝鍥犱負榪欏浠栦滑鏉ヨ鏄€忔槑鐨勩€傝楗頒細灝嗙敤鎴風殑璇鋒眰杞彂 緇欑浉搴旂殑緇勪歡(鍗寵皟鐢ㄧ浉鍏崇殑鏂規硶)錛屽茍鍙兘鍦ㄨ漿鍙戠殑鍓嶅悗鍋氫竴浜涢澶栫殑鍔ㄤ綔(濡傛坊鍔犳粴鍔ㄦ潯)銆傞€氳繃榪欑鏂規硶錛屾垜浠彲浠ユ牴鎹粍鍚堝鏂囨湰鍖哄祵濂椾笉鍚岀殑瑁呴グ錛屼粠鑰?娣誨姞浠繪剰澶氱殑鍔熻兘銆傝繖縐嶅姩鎬佺殑瀵瑰璞℃坊鍔犲姛鑳界殑鏂規硶涓嶄細寮曡搗綾葷殑鐖嗙偢錛屼篃鍏鋒湁浜嗘洿澶氱殑鐏墊椿鎬с€?br /> 銆€銆€ 浠ヤ笂鐨勬柟娉曞氨鏄?strong>Decorator妯″紡錛屽畠閫氳繃緇欏璞℃坊鍔犺楗版潵鍔ㄦ€佺殑娣誨姞鏂扮殑鍔熻兘銆傚涓嬫槸Decorator妯″紡鐨刄ML鍥撅細 ![]() 銆€銆€ Component涓虹粍浠跺拰瑁呴グ鐨勫叕鍏辯埗綾伙紝瀹冨畾涔変簡瀛愮被蹇呴』瀹炵幇鐨勬柟娉曘€?br /> 銆€銆€ ConcreteComponent鏄竴涓叿浣撶殑緇勪歡綾伙紝鍙互閫氳繃緇欏畠娣誨姞瑁呴グ鏉ュ鍔犳柊鐨勫姛鑳姐€?br /> 銆€銆€ Decorator鏄墍鏈夎楗扮殑鍏叡鐖剁被錛屽畠瀹氫箟浜嗘墍鏈夎楗板繀欏誨疄鐜扮殑鏂規硶錛屽悓鏃訛紝瀹冭繕淇濆瓨浜嗕竴涓浜嶤omponent鐨勫紩鐢紝浠ヤ究灝嗙敤鎴風殑璇鋒眰杞彂緇機omponent錛屽茍鍙兘鍦ㄨ漿鍙戣姹傚墠鍚庢墽琛屼竴浜涢檮鍔犵殑鍔ㄤ綔銆?br /> 銆€銆€ ConcreteDecoratorA鍜孋oncreteDecoratorB鏄叿浣撶殑瑁呴グ錛屽彲浠ヤ嬌鐢ㄥ畠浠潵瑁呴グ鍏蜂綋鐨凜omponent銆?br /> 銆€銆€Java IO鍖呬腑鐨凞ecorator妯″紡 銆€銆€ JDK鎻愪緵鐨刯ava.io鍖呬腑浣跨敤浜咲ecorator妯″紡鏉ュ疄鐜板鍚勭杈撳叆杈撳嚭嫻佺殑灝佽銆備互涓嬪皢浠ava.io.OutputStream鍙婂叾瀛愮被涓轟緥錛岃璁轟竴涓婦ecorator妯″紡鍦↖O涓殑浣跨敤銆?br /> 銆€銆€ 棣栧厛鏉ョ湅涓€孌電敤鏉ュ垱寤篒O嫻佺殑浠g爜錛?br />
銆€ 銆€榪欐浠g爜瀵逛簬浣跨敤榪嘕AVA杈撳叆杈撳嚭嫻佺殑浜烘潵璇村啀鐔熸倝涓嶈繃浜嗭紝鎴戜滑浣跨敤DataOutputStream灝佽浜嗕竴涓狥ileOutputStream銆?榪欐槸涓€涓吀鍨嬬殑Decorator妯″紡鐨勪嬌鐢紝FileOutputStream鐩稿綋浜嶤omponent錛孌ataOutputStream灝辨槸涓€涓?Decorator銆傚皢浠g爜鏀規垚濡備笅錛屽皢浼氭洿瀹規槗鐞嗚В錛?br />
銆€銆€ 鐢變簬FileOutputStream鍜孌ataOutputStream鏈夊叕鍏辯殑鐖剁被OutputStream錛屽洜姝ゅ瀵硅薄鐨勮楗板浜庣敤鎴鋒潵璇村嚑涔庢槸閫忔槑鐨勩€備笅闈㈠氨鏉ョ湅鐪婳utputStream鍙婂叾瀛愮被鏄浣曟瀯鎴怐ecorator妯″紡鐨勶細 ![]() 銆€銆€ OutputStream鏄竴涓娊璞$被錛屽畠鏄墍鏈夎緭鍑烘祦鐨勫叕鍏辯埗綾伙紝鍏舵簮浠g爜濡備笅錛?br />
銆€銆€ 瀹冨畾涔変簡write(int b)鐨勬娊璞℃柟娉曘€傝繖鐩稿綋浜嶥ecorator妯″紡涓殑Component綾匯€?br /> 銆€銆€ ByteArrayOutputStream錛孎ileOutputStream 鍜?PipedOutputStream 涓変釜綾婚兘鐩存帴浠嶰utputStream緇ф壙錛屼互ByteArrayOutputStream涓轟緥錛?br />
銆€銆€ 瀹冨疄鐜頒簡OutputStream涓殑write(int b)鏂規硶錛屽洜姝ゆ垜浠彲浠ョ敤鏉ュ垱寤鴻緭鍑烘祦鐨勫璞★紝騫跺畬鎴愮壒瀹氭牸寮忕殑杈撳嚭銆傚畠鐩稿綋浜嶥ecorator妯″紡涓殑ConcreteComponent綾匯€?br /> 銆€銆€ 鎺ョ潃鏉ョ湅涓€涓婩ilterOutputStream錛屼唬鐮佸涓嬶細
銆€ 銆€鍚屾牱錛屽畠涔熸槸浠嶰utputStream緇ф壙銆備絾鏄紝瀹冪殑鏋勯€犲嚱鏁板緢鐗瑰埆錛岄渶瑕佷紶閫掍竴涓狾utputStream鐨勫紩鐢ㄧ粰瀹冿紝騫朵笖瀹冨皢淇濆瓨瀵規瀵硅薄鐨勫紩 鐢ㄣ€傝€屽鏋滄病鏈夊叿浣撶殑OutputStream瀵硅薄瀛樺湪錛屾垜浠皢鏃犳硶鍒涘緩FilterOutputStream銆傜敱浜巓ut鏃㈠彲浠ユ槸鎸囧悜 FilterOutputStream綾誨瀷鐨勫紩鐢紝涔熷彲浠ユ槸鎸囧悜ByteArrayOutputStream絳夊叿浣撹緭鍑烘祦綾葷殑寮曠敤錛屽洜姝や嬌鐢ㄥ灞傚祵濂楃殑鏂?寮忥紝鎴戜滑鍙互涓築yteArrayOutputStream娣誨姞澶氱瑁呴グ銆傝繖涓狥ilterOutputStream綾葷浉褰撲簬Decorator妯″紡涓殑 Decorator綾伙紝瀹冪殑write(int b)鏂規硶鍙槸綆€鍗曠殑璋冪敤浜嗕紶鍏ョ殑嫻佺殑write(int b)鏂規硶錛岃€屾病鏈夊仛鏇村鐨勫鐞嗭紝鍥犳瀹冩湰璐ㄤ笂娌℃湁瀵規祦榪涜瑁呴グ錛屾墍浠ョ戶鎵垮畠鐨勫瓙綾誨繀欏昏鐩栨鏂規硶錛屼互杈懼埌瑁呴グ鐨勭洰鐨勩€?br /> 銆€銆€ BufferedOutputStream 鍜?DataOutputStream鏄疐ilterOutputStream鐨勪袱涓瓙綾伙紝瀹冧滑鐩稿綋浜嶥ecorator妯″紡涓殑 ConcreteDecorator錛屽茍瀵逛紶鍏ョ殑杈撳嚭嫻佸仛浜嗕笉鍚岀殑瑁呴グ銆備互BufferedOutputStream綾諱負渚嬶細
|
Stratrgy搴旂敤姣旇緝騫挎硾,姣斿, 鍏徃緇忚惀涓氬姟鍙樺寲鍥? 鍙兘鏈変袱縐嶅疄鐜版柟寮?涓€涓槸綰挎潯鏇茬嚎,涓€涓槸妗嗗浘(bar),榪欐槸涓ょ綆楁硶,鍙互浣跨敤Strategy瀹炵幇.
榪欓噷浠ュ瓧絎︿覆鏇夸唬涓轟緥, 鏈変竴涓枃浠?鎴戜滑闇€瑕佽鍙栧悗,甯屾湜鏇夸唬鍏朵腑鐩稿簲鐨勫彉閲?鐒跺悗杈撳嚭.鍏充簬鏇夸唬鍏朵腑鍙橀噺鐨勬柟娉曞彲鑳芥湁澶氱鏂規硶,榪欏彇鍐充簬鐢ㄦ埛鐨勮姹?鎵€浠ユ垜浠鍑嗗鍑犲鍙橀噺瀛楃鏇夸唬鏂規.
聽
棣栧厛,鎴戜滑寤虹珛涓€涓娊璞$被RepTempRule 瀹氫箟涓€浜涘叕鐢ㄥ彉閲忓拰鏂規硶:
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"); 銆€銆€ } } |
絎簩姝ワ細鎴戜滑瑕佸緩绔嬩竴涓畻娉曡В鍐崇被錛岀敤鏉ユ彁渚涘鎴風鍙互鑷敱閫夋嫨綆楁硶銆?/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>
public class Singleton { 銆€銆€private Singleton(){} 銆€銆€//鍦ㄨ嚜宸卞唴閮ㄥ畾涔夎嚜宸變竴涓疄渚嬶紝鏄笉鏄緢濂囨€紵 銆€銆€private static Singleton instance = new Singleton(); 銆€銆€//榪欓噷鎻愪緵浜嗕竴涓緵澶栭儴璁塊棶鏈琧lass鐨勯潤鎬佹柟娉曪紝鍙互鐩存帴璁塊棶銆€銆€ |
Double-Checked Locking錛氱敤浜庡綰跨▼搴旂敤紼嬪簭
public class Singleton {
銆€銆€private static Singleton instance = null; } |
聽
聽 聽 鏈夋椂錛屼負澶嶇敤鑰岃璁$殑宸ュ叿綆辯被涓嶈兘澶熻澶嶇敤鐨勫師鍥犱粎浠呮槸鍥犱負瀹冪殑鎺ュ彛涓庝笓涓氬簲鐢ㄩ鍩熸墍闇€瑕佺殑鎺ュ彛涓嶅尮閰嶃€?br />聽聽聽 閫傞厤鍣ㄦā寮忔湁綾葷殑閫傞厤鍣ㄦā寮忓拰瀵硅薄鐨勯€傞厤鍣ㄦā寮忎袱縐嶄笉鍚岀殑褰㈠紡銆?br />
涓€銆佺被鐨勯€傞厤鍣ㄦā寮?br />聽聽聽 綾葷殑閫傞厤鍣ㄦā寮忔妸閫傞厤鐨勭被鐨凙PI杞崲鎴愮洰鏍囩被鐨凙PI銆?br />
聽聽聽 鏈変竴涓緢鍏稿瀷鐨勪緥瀛愬氨鏄紪璇戠郴緇熴€傞€氬父鎴戜滑灝嗙紪璇戠郴緇熷垎瑙d負錛欳ompile鍜孡ink涓や釜姝ラ銆備竴涓狢ompile鍙堝彲浠ュ垎瑙d負璇嶆硶鍒嗘瀽銆佽娉曞垎鏋愩€佽涔夊垎鏋愩€佷腑闂翠唬鐮佺敓鎴愮瓑絳夋楠ゃ€傚浜庣敤鎴鋒潵璁詫紝鎴戜滑涓嶅彲鑳藉皢榪欎簺妯″潡鍒嗗埆鎻愪緵緇欎粬浠紝璁╀粬浠緷嬈¤皟鐢ㄣ€傜浉鍙嶇殑錛屾垜浠簲璇ユ彁渚涗竴涓粺涓€鐨勬帴鍙o紝浣垮緱鐢ㄦ埛鍙互鏂逛究鐨勪嬌鐢ㄥ悇涓姛鑳斤紝渚嬪IDE 銆?/p>
Facade涓€涓吀鍨嬪簲鐢ㄥ氨鏄暟鎹簱JDBC鐨勫簲鐢?濡備笅渚嬪鏁版嵁搴撶殑鎿嶄綔:
public class DBCompare { 銆€銆€Connection conn = null; |
涓婁緥鏄疛sp涓渶閫氬父鐨勫鏁版嵁搴撴搷浣滃姙娉?
鍦ㄥ簲鐢ㄤ腑,緇忓父闇€瑕佸鏁版嵁搴撴搷浣?姣忔閮藉啓涓婅堪涓€孌典唬鐮佽偗瀹氭瘮杈冮夯鐑?闇€瑕佸皢鍏朵腑涓嶅彉鐨勯儴鍒嗘彁鐐煎嚭鏉?鍋氭垚涓€涓帴鍙?榪欏氨寮曞叆浜唂acade澶栬瀵硅薄.濡傛灉浠ュ悗鎴戜滑鏇存崲Class.forName涓殑<driver>涔熼潪甯告柟渚?姣斿浠嶮ysql鏁版嵁搴撴崲鍒癘racle鏁版嵁搴?鍙鏇存崲facade鎺ュ彛涓殑driver灝卞彲浠?
鎴戜滑鍋氭垚浜嗕竴涓?a target="_blank">Facade鎺ュ彛,浣跨敤璇ユ帴鍙?涓婁緥涓殑紼嬪簭灝卞彲浠ユ洿鏀瑰涓?
public class DBCompare { |
鍙闈炲父綆€鍗?鎵€鏈夌▼搴忓鏁版嵁搴撹闂兘鏄嬌鐢ㄦ敼鎺ュ彛,闄嶄綆緋葷粺鐨勫鏉傛€?澧炲姞浜嗙伒媧繪€?
濡傛灉鎴戜滑瑕佷嬌鐢ㄨ繛鎺ユ睜,涔熷彧瑕侀拡瀵筬acade鎺ュ彛淇敼灝卞彲浠?
聽
鐢變笂鍥懼彲浠ョ湅鍑? facade瀹為檯涓婃槸涓悊欏虹郴緇熼棿鍏崇郴,闄嶄綆緋葷粺闂磋€﹀悎搴︾殑涓€涓父鐢ㄧ殑鍔炴硶,涔熻浣犲凡緇忎笉鐭ヤ笉瑙夊湪浣跨敤,灝界涓嶇煡閬撳畠灝辨槸facade.
浠諱綍浜嬬墿瀵硅薄閮芥湁鎶借薄鍜岃涓轟箣鍒嗭紝渚嬪浜猴紝浜烘槸涓€縐嶆娊璞★紝浜哄垎鐢蜂漢鍜屽コ浜虹瓑錛涗漢鏈夎涓猴紝琛屼負涔熸湁鍚勭鍏蜂綋琛ㄧ幇錛屾墍浠ワ紝鈥滀漢鈥濅笌鈥滀漢鐨勮涓衡€濅袱涓蹇典篃鍙嶆槧浜嗘娊璞″拰琛屼負涔嬪垎銆?/p>
鍦ㄩ潰鍚戝璞¤璁$殑鍩烘湰姒傚康涓紝瀵硅薄榪欎釜姒傚康瀹為檯鏄敱灞炴€у拰琛屼負涓や釜閮ㄥ垎緇勬垚鐨勶紝灞炴€ф垜浠彲浠ヨ涓烘槸涓€縐嶉潤姝㈢殑錛屾槸涓€縐嶆娊璞★紝涓€鑸儏鍐典笅錛岃涓烘槸鍖呭惈鍦ㄤ竴涓璞′腑錛屼絾鏄紝鍦ㄦ湁鐨勬儏鍐典笅錛屾垜浠渶瑕佸皢榪欎簺琛屼負涔熻繘琛屽綊綾伙紝褰㈡垚涓€涓€葷殑琛屼負鎺ュ彛錛岃繖灝辨槸妗ユā寮忕殑鐢ㄥ銆?br />
鎬諱箣錛孊ridge妯″紡灝辨槸浣挎娊璞″拰琛屼負鍒嗙錛屽仛鍒板悇鑷殑鐙珛鍙戝睍錛屽氨鏄鎶借薄鍜岃涓哄悇鎶借薄鍑轟竴涓帴鍙c€傚綋闇€瑕佹墿灞曡涓烘垨鑰呮娊璞¢儴鍒嗘椂錛?br />鍙渶鎵╁睍鐩稿簲閮ㄥ垎錛岃€屼笉鐢ㄤ慨鏀瑰師鏉ョ殑緇撴瀯銆?br />
渚嬪瓙涓€錛?/strong>
鍋囧鏈変釜綾籇rawGraph鏈変釜鐢誨渾鐨勬帴鍙o紝褰撶劧榪欎釜鍦嗗艦鍙互鐢ㄩ搮絎旂敾錛屼篃鍙互鐢ㄩ挗絎旂敾銆傚叾涓敾鍦嗘槸鎶借薄閮ㄥ垎錛?br />鐢ㄩ搮絎旂敾鍜岀敤閽㈢瑪鐢繪槸琛屼負閮ㄥ垎銆傚線寰€榪欎釜鏃跺€欐垜浠垎鍒細瀹氫箟閾呯瑪綾籔encilDraw錛岄挗絎旂被PenDraw鏉ュ疄鐜癉raw錛?br />榪欐牱灝變嬌寰楁娊璞¢儴鍒嗗拰琛屼負閮ㄥ垎鍥哄畾鐨勬崋緇戝湪涓€璧鳳紝鎵╁睍鎬т笉寮恒€傚亣濡傝鍔ㄦ€佸鍔犱竴涓敤綺夌瑪鐢葷殑琛屼負鍜屼竴涓敾鏂瑰艦鐨勬娊璞¢儴鍒嗭紝
灝卞繀鐒惰鏂板畾涔変竴涓狢halkDraw綾伙紝DrawGraph綾婚噷澧炲姞drawRectangle鎺ュ彛銆傛樉鐒惰繖鏄緢楹葷儲鐨勩€?/p>
Bridge妯″紡鏄繖鏍峰疄鐜扮殑錛?br />//鎶借薄閮ㄥ垎
public abstract class DrawGraph {
聽private ToolDraw toolDraw;
聽public void setToolDraw(){
聽聽this.toolDraw = ToolDrawSingleton.getToolDraw();//鐢⊿ingleton妯″紡鏉ラ€夊伐鍏楓€?/strong>
聽}
聽
聽public ToolDraw getToolDraw(){
聽聽return toolDraw;
聽}
聽
聽public abstract void draw();
}
//鐢誨渾
public class DrawCircle implements DrawGraph{
聽public DrawCircle(){
聽聽setToolDraw();
聽}
聽public void draw(){
聽聽System.out.pritnln(toolDraw.getName() + " draw circle");
聽}
}
//鐢葷煩褰?br />public class DrawRectangle implements DrawGraph{
聽public DrawRectangle(){
聽聽setToolDraw();
聽}
聽public void draw(){
聽聽System.out.pritnln(toolDraw.getName() + " draw rectangle");
聽}
}
//琛屼負閮ㄥ垎
public abstract class ToolDraw{
聽public abstract String getName();
聽public abstract void drawWithTool();
}
//閾呯瑪
public class PencilDraw implements ToolDraw{
聽private final static String name = "Pencil";
聽
聽public static String getName(){
聽聽return name;
聽}
聽
聽public void drawWithTool(){
聽聽System.out.println("Draw with Pencil.");
聽}
}
//閽㈢瑪
public class PenDraw implements ToolDraw{
聽private final static String name = "Pen";
聽
聽public String getName(){
聽聽return name;
聽}
聽
聽public void drawWithTool(){
聽聽System.out.println("Draw with Pen.");
聽}
}
//綺夌瑪
public class ChalkDraw implements ToolDraw{
聽private final static String name = "Chalk";
聽
聽public String getName(){
聽聽return name;
聽}
聽
聽public void drawWithTool(){
聽聽System.out.println("Draw with Chalk.");
聽}
}
鍋氫竴涓猄ingleton綾繪潵鑱旂郴鎶借薄鍜岃涓恒€傞€氳繃姝ょ被鏉ラ€夊伐鍏?br />public class ToolDrawSingleton{
聽private static ToolDraw toolDraw;
聽
聽public ToolDrawSingleton(ToolDraw toolDraw){
聽聽this.toolDraw = toolDraw
聽}
聽public static ToolDraw getToolDraw(){
聽聽return toolDraw;
聽}
}
鍋囧鎴戜滑鐜板湪瑕佺敤綺夌瑪鏉ョ敾涓€涓柟褰?涓€涓渾褰細
//鍙栧緱宸ュ叿
ToolDrawSingleton tool = new ToolDrawSingleton(new ChalkDraw());
//鐢繪柟褰?br />DrawGraph drawRectangle = new DrawRectangle();
drawRectangle.draw();
//鐢誨渾褰?br />drawRectangle = new DrawCircle();
drawRectangle.draw();
渚嬪瓙浜岋細
渚嬪,涓€鏉挅鍟′負渚?瀛愮被瀹炵幇綾諱負鍥涗釜錛氫腑鏉姞濂躲€佸ぇ鏉姞濂躲€?涓澂涓嶅姞濂躲€佸ぇ鏉笉鍔犲ザ銆?/p>
浣嗘槸錛屾垜浠敞鎰忓埌錛氫笂闈㈠洓涓瓙綾諱腑鏈夋蹇甸噸鍙狅紝鍙粠鍙﹀涓€涓搴﹁繘琛岃€冭檻錛岃繖鍥涗釜綾誨疄闄呮槸涓や釜瑙掕壊鐨勭粍鍚堬細鎶借薄 鍜岃涓猴紝鍏朵腑鎶借薄涓猴細涓澂鍜屽ぇ鏉紱琛屼負涓猴細鍔犲ザ 涓嶅姞濂訛紙濡傚姞姍欐眮 鍔犺嫻鏋滄眮錛?
瀹炵幇鍥涗釜瀛愮被鍦ㄦ娊璞″拰琛屼負涔嬮棿鍙戠敓浜嗗浐瀹氱殑緇戝畾鍏崇郴錛屽鏋滀互鍚庡姩鎬佸鍔犲姞钁¤悇姹佺殑琛屼負錛屽氨蹇呴』鍐嶅鍔犱袱涓被錛氫腑鏉姞钁¤悇姹佸拰澶ф澂鍔犺憽钀勬眮銆傛樉鐒舵販涔?鎵╁睍鎬ф瀬宸€?/p>
閭f垜浠粠鍒嗙鎶借薄鍜岃涓虹殑瑙掑害錛屼嬌鐢˙ridge妯″紡鏉ュ疄鐜般€?/p>
濡備綍瀹炵幇?
浠ヤ笂闈㈡彁鍒扮殑鍜栧暋 涓轟緥. 鎴戜滑鍘熸潵鎵撶畻鍙璁′竴涓帴鍙?鎶借薄綾?,浣跨敤Bridge妯″紡鍚?鎴戜滑闇€瑕佸皢鎶借薄鍜岃涓哄垎寮€,鍔犲ザ鍜屼笉鍔犲ザ灞炰簬琛屼負,鎴戜滑灝嗗畠浠娊璞℃垚涓€涓笓闂ㄧ殑琛屼負鎺ュ彛.
鍏堢湅鐪嬫娊璞¢儴鍒嗙殑鎺ュ彛浠g爜:
public abstract class Coffee { 銆€銆€CoffeeImp coffeeImp; 銆€銆€public void setCoffeeImp() { 銆€銆€銆€銆€this.CoffeeImp = CoffeeImpSingleton.getTheCoffeImp(); 銆€銆€} 銆€銆€public CoffeeImp getCoffeeImp() {return this.CoffeeImp;} 銆€銆€public abstract void pourCoffee(); } |
鍏朵腑CoffeeImp 鏄姞涓嶅姞濂剁殑琛屼負鎺ュ彛,鐪嬪叾浠g爜濡備笅:
public abstract class CoffeeImp { 銆€銆€public abstract void pourCoffeeImp(); } |
鐜板湪鎴戜滑鏈変簡涓や釜鎶借薄綾?涓嬮潰鎴戜滑鍒嗗埆瀵瑰叾榪涜緇ф壙,瀹炵幇concrete class:
//涓澂 //澶ф澂 |
涓婇潰鍒嗗埆鏄腑鏉拰澶ф澂鐨勫叿浣撳疄鐜?涓嬮潰鍐嶅琛屼負CoffeeImp榪涜緇ф壙:
//鍔犲ザ //涓嶅姞濂?br />public class FragrantCoffeeImp extends CoffeeImp |
Bridge妯″紡鐨勫熀鏈鏋舵垜浠凡緇忔惌濂戒簡,鍒繕璁板畾涔変腑榪樻湁涓€鍙?鍔ㄦ€佺粨鍚?鎴戜滑鐜板湪鍙互鍠濆埌鑷沖皯鍥涚鍜栧暋:
1.涓澂鍔犲ザ
2.涓澂涓嶅姞濂?br />3.澶ф澂鍔犲ザ
4.澶ф澂涓嶅姞濂?/p>
鐪嬬湅鏄浣曞姩鎬佺粨鍚堢殑,鍦ㄤ嬌鐢ㄤ箣鍓?鎴戜滑鍋氫釜鍑嗗宸ヤ綔,璁捐涓€涓崟鎬佺被(Singleton)鐢ㄦ潵hold褰撳墠鐨凜offeeImp:
public class CoffeeImpSingleton { 銆€銆€private static CoffeeImp coffeeImp; 銆€銆€public CoffeeImpSingleton(CoffeeImp coffeeImpIn) 銆€銆€ {this.coffeeImp = coffeeImpIn;} 銆€銆€public static CoffeeImp getTheCoffeeImp() 銆€銆€{ 銆€銆€銆€銆€return coffeeImp; 銆€銆€} } |
鐪嬬湅涓澂鍔犲ザ 鍜屽ぇ鏉姞濂?鏄€庝箞鍑烘潵鐨?
//鎷垮嚭鐗涘ザ
CoffeeImpSingleton coffeeImpSingleton = new CoffeeImpSingleton(new MilkCoffeeImp());
//涓澂鍔犲ザ
MediumCoffee mediumCoffee = new MediumCoffee();
mediumCoffee.pourCoffee();
//澶ф澂鍔犲ザ
SuperSizeCoffee superSizeCoffee = new SuperSizeCoffee();
superSizeCoffee.pourCoffee();
娉ㄦ剰: Bridge妯″紡鐨勬墽琛岀被濡侰offeeImp鍜孋offee鏄竴瀵逛竴鐨勫叧緋? 姝g‘鍒涘緩CoffeeImp鏄妯″紡鐨勫叧閿€?br />