鎴戜滑鍏堟潵鐪嬩竴涓鐩細璁捐涓€涓腑瀛愮埗绫绘潵浠h〃鎵€鏈夌殑楦瓙锛岃姹傛墍鏈夌殑楦瓙瀛愮被閮藉湪鐖剁被涓疄鐜拌皟鐢ㄥ拰杩愯杩欎袱涓姛鑳姐€備綘鍙互杩欐牱璁捐锛歱ublicclassDuck{publicvoidrun(){System.out.println("楦瓙宸﹀彸鏅冨姩");}publicvoidcall(){System.out.println("楦瓙鍦ㄥ彨");}}璁╂瘡涓腑瀛愮被閮界户鎵緿uck锛岃繖鏍锋墍鏈夌殑楦瓙閮藉彲浠ョ洿鎺ヤ娇鐢ㄧ埗绫讳腑鐨勬柟娉曪紝鎴栬€呴噸鍐欐柟娉曟潵婊¤冻鍏朵粬楦瓙鐨勯渶瑕併€備綘瑙夊緱锛岃繖涔熷お绠€鍗曚簡鍚?鈥锯棥鈼?銆傜悊鎯冲緢涓版弧锛岀幇瀹炲嵈寰堟畫閰枫€傛垜浠彧璁茶璁′竴涓腑瀛愬瓙绫绘潵瀹炵幇鐖剁被鐨勪袱涓姛鑳斤紝浣嗕笉璇村畠鏄竴绉嶄粈涔堟牱鐨勯腑瀛愩€傚鏋滄槸鐑ら腑锛屽畠涓嶄細璺戞帀锛屽彧浼氬緢棣欚煠ゃ€傝€屽畠鐨勫疄鐜板氨鍍忚繖鏍穚ublicclassBBQDuck{publicvoidrun(){System.out.println("鐑ら腑涓嶄細璺?);}publicvoidcall(){System.out.println("鐑ら腑婊嬫粙Called");}}杩欐牱鐨勪緥瀛愯繕鏈夊緢澶氾紝姣斿灏忛粍楦帺鍏疯溅鍙兘鍚戝墠璺戯紝鍞愯€侀腑浼氳璇濈瓑绛夛紝鏈潵浼氭湁浠€涔堟牱鐨勯腑瀛愬姞鍏ワ紝鎴戜滑鏃犳硶棰勬祴銆備絾鏄緢鏄庢樉锛岄€氳繃缁ф壙鐖剁被鐨勬柟寮忛噸鍐欐槸琛屼笉閫氱殑锛屽洜涓轰笉鍙兘姣忓彧楦瓙鐨剅un鍜宑all鏂规硶閮介噸鍐欍€傚苟涓旀湁浜涘疄鐜颁笉鍚屼簬鐖剁被锛屼絾鍦ㄥ瓙绫讳腑鏄€氱敤鐨勩€傛瘮濡傚ぉ娲ユ澘楦拰鍖椾含鐑ら腑閮解€滄补婊嬫粙鈥濈瓑绛夈€傞偅涔堝浣曡В鍐抽棶棰橈紝杩欎釜鏃跺€欏氨闇€瑕佺瓥鐣ユā寮忕殑鐧诲満浜嗐€傜瓥鐣ユā寮忓畾涔変簡涓€绯诲垪绠楁硶锛屽苟灏嗘瘡涓畻娉曟斁鍒颁竴涓嫭绔嬬殑绫讳腑锛屼娇绠楁硶涔嬮棿鍙互鐩镐簰鏇夸唬銆傜粨鍚堜笂闈㈢殑渚嬪瓙锛屾垜浠娇鐢ㄧ瓥鐣ユā寮忓皢涓婇潰鐨勨€滅儰楦搧鏉库€濇娊鍙栧嚭鏉ヤ竴涓嫭绔嬬殑绫伙紝鏆備笖绉颁箣涓衡€滈搧鏉跨被鈥濄€傚綋鏈夊彟涓€涓笂娴风儰楦椂锛屾垜浠彧闇€瑕佽涓婃捣鐑ら腑浣跨敤閾佹澘绫绘潵瀹炵幇閾佹澘鍔熻兘锛屼笉闇€瑕侀噸鏂板疄鐜扮被涓噸澶嶇殑鍐呭锛屽噺灏戜簡寮€鍙戠殑鍐椾綑銆傚綋涓嶉渶瑕亃izi绫荤殑鏃跺€欙紝鎴戜滑鍙互鐢ㄥ叾浠栫殑鍔熻兘绫绘潵鏇挎崲锛岃€屽綋鍔熻兘绫婚渶瑕佹敼鍙樼殑鏃跺€欙紝鎴戜滑鍙渶瑕佹敼鍙樼被涓殑浠g爜锛岃繖鏍锋墍鏈変娇鐢ㄨ鍔熻兘绫荤殑瀛愮被閮戒細鏀瑰彉涓€璧疯В鑰︿唬鐮併€傝€屼笖鏇寸伒娲汇€備唬鐮佸疄鐜板畾涔夐渶瑕佺殑鍔熻兘鎺ュ彛publicinterfaceRunnable{publicvoidrun();}publicinterfaceCallable{publicvoidcall();}鍦ㄦ垜浠笂闈㈡彁鍒扮殑渚嬪瓙涓紝鍥犱负run鍜宑all鏂规硶涓殑鍐呭鏄笉鏂彉鍖栫殑鏄殑锛屾墍浠ユ垜浠妸杩欎釜閫氱敤浣嗗彉鍖栧绔殑鏂规硶鎶藉彇鍑烘潵杩涜灏佽锛孋allable鍜孯unnable鎺ュ彛锛堟垜浠嚜宸卞畾涔夌殑锛変唬琛ㄦ垜浠浣跨敤鐨勫姛鑳斤紝閫氳繃鎺ュ彛瀹炵幇澶氭€併€傝繖绉嶆娊鍙栧叕鍏卞彉鍖栬繘琛屽皝瑁咃紝浠庤€屾彁楂樹唬鐮佺殑缁存姢鎬у拰鎵╁睍鎬э紝鏄墍鏈夎璁℃ā寮忕殑鏍稿績鎬濇兂銆傚畾涔変竴涓腑瀛愮被鏉ヤ唬琛ㄦ墍鏈夌殑楦瓙publicclassDuck{privateCallablecallable;绉佹湁Runnable鍙繍琛岋紱publicDuck(Callablecallable,Runnablerunnable){this.callable=callable;this.runnable=鍙繍琛岋紱}publicvoidaction(){鍙皟鐢ㄣ€傜О鍛硷紙锛?runnable.run();}}Duck鏋勯€犲嚱鏁颁紶鍏ュ叿浣撳疄鐜版帴鍙g殑鍔熻兘绫伙紝action鏂规硶璋冪敤鎴戜滑浼犲叆鐨勫璞$殑鍏蜂綋琛屼负銆傚疄鐜癛unnable鎺ュ彛publicclassLeftRightRunimplementsRunnable{@Overridepublicvoidrun(){System.out.println("宸﹀彸璺?);}}publicclassNoRunnableimplementsRunnable{@Overridepublicvoidrun(){System.out.println("willnotrun");}}publicclassForwardRunimplementsRunnable{@Overridepublicvoidrun(){System.out.println("runforward");}}瀹炵幇Callable鎺ュ彛publicclassNoCallableimplementsCallable{@Overridepublicvoidcall(){System.out.println("Notcalled");}}publicclassSpecialCallimplementsCallable{@Overridepublicvoidcall(){System.out.println("Uniquecall");}}缂栧啓娴嬭瘯绫籶ublicclassstrategyDemo{publicstaticvoidmain(String[]args){DuckBBQDuck=newDuck(newSpecialCall(),newNoRunnable());\\RoastDuckDuckTangDuck=newDuck(newSpecialCall(),newLeftRightRun());\\DonaldDuckDuckCar=newDuck(newNoCallable(),newForwardRun());\\toycarduckSystem.out.println("鐑ら腑鐨勮涓猴細");BBQDuck.action();System.out.println("鍞愯€侀腑鐨勮涓猴細");鍞愰腑.action();System.out.println("楦瓙鐜╁叿杞﹁涓猴細");DuckCar.action();}}杩愯缁撴灉灏辫繖鏍凤紝鎴戜滑璁捐鍑轰簡涓€鍙畬缇庣殑楦瓙馃鎴戞槸Haoo锛屼竴涓箰瑙傜殑鐮佸啘锛屽啓鍑烘湁瓒g殑鏂囩珷銆俓濡傛灉鏈枃瀵规偍鏈夊府鍔╋紝璇锋敹钘忊瓙鍠滄馃憤骞跺叧娉煈€锛屽叧娉ㄤ笉杩疯矾(馃尰鈼♀€库棥)
