23绉嶈璁℃ā寮忥紙四锛夛細妯℃澘妯″紡

23绉嶈璁℃ā寮忥紙4锛夛細妯℃澘妯″紡

1 杈夌厡宸ョ▼鈥斺€斿埗閫犳倣椹?/span>

聽鍛ㄤ笁锛?:00锛屾垜鍒氬垰鍧愬埌浣嶇疆涓婏紝鎵撳紑鐢佃剳鍑嗗寮€濮嬪共娲汇€?/p>

鈥滃皬涓夛紝灏忎笁锛屽彨涓€涓嬪叾浠栧悓浜嬶紝鍒颁細璁寮€浼氣€濓紝鑰佸ぇ璺戣繃鏉ュ惣锛屽甫鐫€鍧忕瑧銆傝繕娌$瓑澶у鍧愮ǔ锛岃€佸ぇ灏卞紑璁蹭簡锛?br>鈥滃憡璇夊ぇ瀹朵竴涓ソ娑堟伅锛屾槰澶╃粓浜庢妸脳脳妯″瀷鍏徃鐨勫彛瀛愭墦寮€浜嗭紝瑕佹垜浠仛鎮嶉┈妯″瀷锛岃櫧鐒舵槸绗竴涓溅杈嗘ā鍨嬶紝浣嗘槸鎴戜滑鏈夎兘鍔涖€佹湁淇″績鍋氬ソ锛屾垜浠竴瀹氳鈥︹€︹€濓紙涓棿鐪佺暐20鍒嗛挓鐨勮璇濓紝濡傛灉浣犲惉杩囬瀵间汉鐨勮璇濓紝杩欎釜浣犲簲璇ヨ兘澶熺画涓婏級
鍔ㄥ憳宸ヤ綔鍋氬畬浜嗭紝閭e氨寮€濮嬪帇浠诲姟浜嗐€傗€滆繖娆℃椂闂存槸闈炲父绱у紶鐨勶紝鍙湁涓€涓槦鏈熺殑鏃堕棿锛屽皬涓夛紝浣犺礋璐e湪涓€涓槦鏈熺殑鏃堕棿鎶婅繖鎵?0涓囪溅妯★紙娉細杞︽ā鏄溅杈嗘ā鍨嬬殑鎰忔€濓紝涓嶆槸棣欒溅缇庡コ閭d釜杞︽ā锛夊缓璁惧畬鎴愨€︹€︹€?br>鈥滀竴涓槦鏈燂紵杩欎釜鈥︹€︽槸鐪熷仛涓嶅畬锛岃鍋氬垎鏋愶紝鍋氭ā鏉匡紝鍋?a class="replace_word" href="http://lib.****.net/base/softwaretest" title="杞欢娴嬭瘯鐭ヨ瘑搴? style="color: #df3434; font-weight: bold;" target="_blank">娴嬭瘯锛岃繕瑕佽€冭檻鎵╁睍鎬с€佺ǔ瀹氭€с€佸仴澹€х瓑锛屾椂闂村疄鍦ㄦ槸澶皯浜嗐€傗€濊繕娌$瓑鑰佸ぇ璇村畬锛屾垜灏辨€ヤ簡锛屽啀涓嶆€ユ垜鐨勫皬鍛藉氨鎶樺湪涓婇潰浜嗭紒
鈥滈偅杩欐牱锛屽彧鍋氭渶鍩烘湰鐨勫疄鐜帮紝涓嶈€冭檻澶鐨勯棶棰橈紝鎬庝箞鏍凤紵鈥濊€佸ぇ鍙堟妸鎴戝脊鍥炲幓浜嗐€?br>鈥滃彧浣滃熀鏈疄鐜帮紵閭b€︹€︹€?br>鍞夛紝棰嗗宸茬粡甯冪疆浠诲姟浜嗭紝閭e氨寮€濮嬫嫾鍛藉湴鍋氬惂銆傜劧鍚庡氨寮€濮嬪噯澶囧姩鎵嬪仛锛屽湪鍋氫箣鍓嶅厛浠嬬粛涓€涓嬫垜浠叕鍙哥殑鑳屾櫙锛屾垜浠叕鍙告槸鍋氭ā鍨嬬敓浜х殑锛屽仛杩囨ˉ姊佹ā鍨嬨€佸缓绛戞ā鍨嬨€佹満姊版ā
鍨嬶紝鐢氳嚦鏄竴浜涙斂搴溿€佸啗浜嬬殑鏈哄瘑妯″瀷锛岃繖涓笉鑳界粏璇达紝缁濆瘑銆傚叕鍙哥殑涓昏涓氬姟灏辨槸鎶婂疄鐗╂寜鐓т竴瀹氱殑姣斾緥缂╁皬鎴栨斁澶э紝鐢ㄤ簬璇曢獙銆佸垎鏋愩€侀噺鍖栨垨鑰呮槸閿€鍞紝绛夌瓑锛屼笂闈㈡彁鍒扮殑脳脳妯″瀷
鍏徃鏄笓闂ㄩ攢鍞溅杈嗘ā鍨嬬殑鍏徃锛岃嚜宸辨病鏈夌敓浜т紒涓氾紝鍏ㄩ儴鏄唬宸ャ€傛垜浠叕鍙告槸绗竴娆′粠脳脳妯″瀷鍏徃鎺ュ崟锛岄偅鎴戞€庝箞鐫€涔熻鎶婃椿骞插ソ锛屽彲鏃堕棿鏈夐檺锛屼换鍔¢噺鍙堝法澶э紝鎬庝箞鍔烇紵
鏃㈢劧棰嗗閮借浜嗭紝涓嶈€冭檻鎵╁睍鎬э紝閭eソ鍔烇紝鍏堟寜鐓ф渶涓€鑸殑缁忛獙璁捐绫诲浘锛屽涓嬪浘鎵€绀?

23绉嶈璁℃ā寮忥紙四锛夛細妯℃澘妯″紡

聽闈炲父绠€鍗曠殑瀹炵幇锛屾倣椹溅鏈変袱涓瀷鍙凤紝H1鍜孒2銆傛寜鐓ч渶姹傦紝鍙渶瑕佹倣椹ā鍨嬶紝閭eソ鎴戝氨缁欎綘鎮嶉┈妯″瀷锛屽厛鍐欎釜鎶借薄绫伙紝鐒跺悗涓や釜涓嶅悓鍨嬪彿鐨勬ā鍨嬪疄鐜扮被锛岄€氳繃绠€鍗曠殑缁ф壙灏卞彲浠?/p>

瀹炵幇涓氬姟瑕佹眰銆傛垜浠厛浠庢娊璞$被寮€濮嬬紪鍐欙紝鎶借薄鎮嶉┈妯″瀷濡備唬鐮佹竻鍗曞涓嬫墍绀恒€?/p>

 1 public abstract class HummerModel {
 2 
 3     /*
 4      * 棣栧厛锛岃繖涓ā鍨嬭鑳藉琚彂鍔ㄨ捣鏉ワ紝鍒鏄墜鎽囧彂鍔紝杩樻槸鐢靛姏鍙戝姩锛屽弽姝?
 5      * 鏄鑳藉鍙戝姩璧锋潵锛岄偅杩欎釜瀹炵幇瑕佸湪瀹炵幇绫婚噷浜?
 6      */
 7     public abstract void start();
 8     
 9     //鑳藉彂鍔紝閭h繕瑕佽兘鍋滀笅鏉ワ紝閭f墠鏄湡鏈簨
10     public abstract void stop();
11     
12     //鍠囧彮浼氬嚭澹伴煶锛屾槸婊存淮鍙紝杩樻槸鍝斿摂鍙?/span>
13     public abstract void alarm();
14     
15     //寮曟搸浼氳桨闅嗛殕鐨勫搷锛屼笉鍝嶉偅鏄亣鐨?/span>
16     public abstract void engineBoom();
17     
18     //閭fā鍨嬪簲璇ヤ細璺戝惂锛屽埆绠℃槸浜烘帹鐨勶紝杩樻槸鐢靛姏椹卞姩锛屾€讳箣瑕佷細璺?/span>
19     public abstract void run();
20 
21 }

鍦ㄦ娊璞$被涓紝鎴戜滑瀹氫箟浜嗘倣椹ā鍨嬮兘蹇呴』鍏锋湁鐨勭壒璐細鑳藉鍙戝姩銆佸仠姝紝鍠囧彮浼氬搷锛屽紩鎿庡彲浠ヨ桨楦o紝鑰屼笖杩樺彲浠ュ仠姝€備絾鏄瘡涓瀷鍙风殑鎮嶉┈瀹炵幇鏄笉鍚岀殑锛孒1鍨嬪彿鐨勬倣椹浠g爜
娓呭崟濡備笅鎵€绀恒€?/p>

 1 public class HummerH1Model extends HummerModel {
 2     //H1鍨嬪彿鐨勬倣椹溅楦g瑳
 3     public void alarm() {
 4         System.out.println("鎮嶉┈H1楦g瑳...");
 5     }
 6 
 7     //寮曟搸杞伴福澹?/span>
 8     public void engineBoom() {
 9         System.out.println("鎮嶉┈H1寮曟搸澹伴煶鏄繖鏍峰湪...");
10     }
11 
12     //姹借溅鍙戝姩
13     public void start() {
14         System.out.println("鎮嶉┈H1鍙戝姩...");
15     }
16     
17     //鍋滆溅
18     public void stop() {
19         System.out.println("鎮嶉┈H1鍋滆溅...");
20     }
21     
22     //寮€鍔ㄨ捣鏉?/span>
23     public void run(){
24 
25         //鍏堝彂鍔ㄦ苯杞?/span>
26         this.start();
27         
28         //寮曟搸寮€濮嬭桨楦?/span>
29         this.engineBoom();
30         
31         //鐒跺悗灏卞紑濮嬭窇浜嗭紝璺戠殑杩囩▼涓亣鍒颁竴鏉$嫍鎸¤矾锛屽氨鎸夊枃鍙?/span>
32         this.alarm();
33         
34         //鍒拌揪鐩殑鍦板氨鍋滆溅
35         this.stop();
36 
37     }
38 
39 }

澶у娉ㄦ剰鐪媟un()鏂规硶锛岃繖鏄竴涓眹鎬荤殑鏂规硶锛屼竴涓ā鍨嬬敓浜ф垚鍔熶簡锛屾€昏鎷跨粰瀹㈡埛妫€娴嬪惂锛屾€庝箞妫€娴嬶紵鈥滄槸楠″瓙鏄┈锛屾媺鍑哄幓婧滄簻鈥濓紝杩欏氨鏄竴绉嶆楠屾柟娉曪紝璁╁畠璺戣捣鏉ワ紒閫氳繃run()
杩欐牱鐨勬柟娉曪紝鎶婃ā鍨嬬殑鎵€鏈夊姛鑳介兘娴嬭瘯鍒颁簡銆?br>H2鍨嬪彿鎮嶉┈濡備唬鐮佹竻鍗曞涓嬫墍绀?

 1 public class HummerH2Model extends HummerModel {
 2     //H2鍨嬪彿鐨勬倣椹溅楦g瑳
 3     public void alarm() {
 4         System.out.println("鎮嶉┈H2楦g瑳...");
 5     }
 6 
 7     //寮曟搸杞伴福澹?/span>
 8     public void engineBoom() {
 9         System.out.println("鎮嶉┈H2寮曟搸澹伴煶鏄繖鏍峰湪...");
10     }
11 
12     //姹借溅鍙戝姩
13     public void start() {
14         System.out.println("鎮嶉┈H2鍙戝姩...");
15     }
16     
17     //鍋滆溅
18     public void stop() {
19         System.out.println("鎮嶉┈H2鍋滆溅...");
20     }
21     
22     //寮€鍔ㄨ捣鏉?/span>
23     public void run(){
24 
25         //鍏堝彂鍔ㄦ苯杞?/span>
26         this.start();
27         
28         //寮曟搸寮€濮嬭桨楦?/span>
29         this.engineBoom();
30         
31         //鐒跺悗灏卞紑濮嬭窇浜嗭紝璺戠殑杩囩▼涓亣鍒颁竴鏉$嫍鎸¤矾锛屽氨鎸夊枃鍙?/span>
32         this.alarm();
33         
34         //鍒拌揪鐩殑鍦板氨鍋滆溅
35         this.stop();
36     }
37 
38 }

濂戒簡锛岀▼搴忕紪鍐欏埌杩欓噷锛屽凡缁忓彂鐜伴棶棰樹簡锛屼袱涓疄鐜扮被鐨剅un()鏂规硶閮芥槸瀹屽叏鐩稿悓鐨勶紝閭h繖涓猺un()鏂规硶鐨勫疄鐜板簲璇ュ嚭鐜板湪鎶借薄绫伙紝涓嶅簲璇ュ湪瀹炵幇绫讳笂锛屾娊璞℃槸鎵€鏈夊瓙绫荤殑鍏辨€у皝瑁呫€?br>娉ㄦ剰銆€鍦ㄨ蒋浠跺紑鍙戣繃绋嬩腑锛屽鏋滅浉鍚岀殑涓€娈典唬鐮佸鍒惰繃涓ゆ锛屽氨闇€瑕佸璁捐浜х敓鎬€鐤戯紝鏋舵瀯甯堣鏄庣‘鍦拌鏄庝负浠€涔堢浉鍚岀殑閫昏緫瑕佸嚭鐜颁袱娆℃垨鏇村娆°€?br>濂斤紝闂鍙戠幇浜嗭紝鎴戜滑灏遍渶瑕侀┈涓婃洿鏀癸紝淇敼鍚庣殑绫诲浘濡傚浘濡備笅鎵€绀恒€?/p>

23绉嶈璁℃ā寮忥紙四锛夛細妯℃澘妯″紡

 1 public abstract class HummerModel {
 2 
 3     /*
 4      * 棣栧厛锛岃繖涓ā鍨嬭鑳藉琚彂鍔ㄨ捣鏉ワ紝鍒鏄墜鎽囧彂鍔紝杩樻槸鐢靛姏鍙戝姩锛屽弽姝?
 5      * 鏄鑳藉鍙戝姩璧锋潵锛岄偅杩欎釜瀹炵幇瑕佸湪瀹炵幇绫婚噷浜?
 6      */
 7     public abstract void start();
 8     
 9     //鑳藉彂鍔紝閭h繕瑕佽兘鍋滀笅鏉ワ紝閭f墠鏄湡鏈簨
10     public abstract void stop();
11     
12     //鍠囧彮浼氬嚭澹伴煶锛屾槸婊存淮鍙紝杩樻槸鍝斿摂鍙?/span>
13     public abstract void alarm();
14     
15     //寮曟搸浼氳桨闅嗛殕鐨勫搷锛屼笉鍝嶉偅鏄亣鐨?/span>
16     public abstract void engineBoom();
17     
18     //閭fā鍨嬪簲璇ヤ細璺戝惂锛屽埆绠℃槸浜烘帹鐨勶紝杩樻槸鐢靛姏椹卞姩锛屾€讳箣瑕佷細璺?/span>
19     public void run(){
20         //鍏堝彂鍔ㄦ苯杞?/span>
21         this.start();
22         
23         //寮曟搸寮€濮嬭桨楦?/span>
24         this.engineBoom();
25         
26         //鐒跺悗灏卞紑濮嬭窇浜嗭紝璺戠殑杩囩▼涓亣鍒颁竴鏉$嫍鎸¤矾锛屽氨鎸夊枃鍙?/span>
27         this.alarm();
28         
29         //鍒拌揪鐩殑鍦板氨鍋滆溅
30         this.stop();
31     }
32 
33 }

鍦ㄦ娊璞$殑鎮嶉┈妯″瀷涓婂凡缁忓畾涔変簡run()鏂规硶鐨勬墽琛岃鍒欙紝鍏堝惎鍔紝鐒跺悗寮曟搸绔嬪埢杞伴福锛屼腑闂磋繕瑕佹寜涓€涓嬪枃鍙紝鍒堕€犵偣鍣0锛堣涓嶅氨涓嶆槸鍚嶈溅浜嗭級銆傜劧鍚庡仠杞︼紝瀹冪殑涓や釜鍏蜂綋瀹炵幇绫诲氨
涓嶉渶瑕佸疄鐜皉un()鏂规硶浜嗭紝鍙鎶婁唬鐮佹竻鍗?0-2銆佷唬鐮佹竻鍗?0-3涓婄殑run()鏂规硶鍒犻櫎鍗冲彲锛屼笉鍐嶈禈杩颁唬鐮併€?br>鍦烘櫙绫诲疄鐜扮殑浠诲姟灏辨槸鎶婄敓浜у嚭鐨勬ā鍨嬪睍鐜扮粰瀹㈡埛锛屽叾婧愪唬鐮佸浠g爜娓呭崟濡備笅鎵€绀恒€?/p>

public class Client {

    public static void main(String[] args) {
        //鐗涘弶鍏徃瑕丠1鍨嬪彿鐨勬倣椹?/span>
        HummerModel h1 = new HummerH1Model();
        
        //H1妯″瀷婕旂ず
        h1.run();
    }
}

杩愯缁撴灉濡備笅:

鎮嶉┈H1鍙戝姩...
鎮嶉┈H1寮曟搸澹伴煶鏄繖鏍风殑...
鎮嶉┈H1楦g瑳...
鎮嶉┈H1鍋滆溅...

鐩墠瀹㈡埛鍙鐪婬1鍨嬪彿鐨勬倣椹溅锛屾病闂锛岀敓浜у嚭鏉ワ紝鍚屾椂鍙互杩愯璧锋潵缁欎粬鐪嬬湅銆?br>闈炲父绠€鍗曪紝閭e鏋滄垜鍛婅瘔浣犺繖灏辨槸妯℃澘鏂规硶妯″紡浣犱細涓嶄細寰堜笉灞戝憿锛熷氨杩欐ā寮忥紝澶畝鍗曚簡锛屾垜涓€鐩村湪浣跨敤鍛€锛佹槸鐨勶紝浣犵粡甯稿湪浣跨敤锛屼絾浣犱笉鐭ラ亾杩欐槸妯℃澘鏂规硶妯″紡锛岄偅浜涙墍璋撶殑楂樻墜灏?br>鍙互寰堢墰鍦拌锛氣€滅敤妯℃澘鏂规硶妯″紡灏卞彲浠ュ疄鐜扳€濓紝浣犺繕瑕佸緢宕囨嫓鍦扮湅鐫€锛屽搰锛岀墰浜猴紝妯℃澘鏂规硶妯″紡鏄粈涔堝憖锛熻繖灏辨槸妯℃澘鏂规硶妯″紡銆?/p>

2 妯℃澘鏂规硶妯″紡鐨勫畾涔?/span>

妯℃澘鏂规硶妯″紡锛圱emplate Method Pattern锛夋槸濡傛绠€鍗曪紝浠ヨ嚧璁╀綘鎰熻浣犲凡缁忚兘澶熸帉鎻″叾绮鹃珦浜嗐€傚叾瀹氫箟濡備笅锛?br>Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template
Method lets subclasses redefine certain steps of an algorithm without changing the algorithm'sstructure.

锛堝畾涔変竴涓搷浣滀腑鐨?a class="replace_word" href="http://lib.****.net/base/datastructure" title="绠楁硶涓庢暟鎹粨鏋勭煡璇嗗簱" style="color: #df3434; font-weight: bold;" target="_blank">绠楁硶鐨勬鏋讹紝鑰屽皢涓€浜涙楠ゅ欢杩熷埌瀛愮被涓€備娇寰楀瓙绫诲彲浠ヤ笉鏀瑰彉涓€涓畻娉曠殑缁撴瀯鍗冲彲閲嶅畾涔夎绠楁硶鐨勬煇浜涚壒瀹氭楠ゃ€傦級
妯℃澘鏂规硶妯″紡鐨勯€氱敤绫诲浘濡傚浘鎵€绀?

23绉嶈璁℃ā寮忥紙四锛夛細妯℃澘妯″紡

妯℃澘鏂规硶妯″紡纭疄闈炲父绠€鍗曪紝浠呬粎浣跨敤浜?a class="replace_word" href="http://lib.****.net/base/javase" title="Java SE鐭ヨ瘑搴? style="color: #df3434; font-weight: bold;" target="_blank">Java鐨勭户鎵挎満鍒讹紝浣嗗畠鏄竴涓簲鐢ㄩ潪甯稿箍娉涚殑妯″紡銆傚叾涓紝AbstractClass鍙仛鎶借薄妯℃澘锛屽畠鐨勬柟娉曞垎涓轰袱绫伙細
鈼?鍩烘湰鏂规硶
聽 鍩烘湰鏂规硶涔熷彨鍋氬熀鏈搷浣滐紝鏄敱瀛愮被瀹炵幇鐨勬柟娉曪紝骞朵笖鍦ㄦā鏉挎柟娉曡璋冪敤銆?br>鈼?妯℃澘鏂规硶
聽 聽鍙互鏈変竴涓垨鍑犱釜锛屼竴鑸槸涓€涓叿浣撴柟娉曪紝涔熷氨鏄竴涓鏋讹紝瀹炵幇瀵瑰熀鏈柟娉曠殑璋冨害锛屽畬鎴愬浐瀹氱殑閫昏緫銆?br>娉ㄦ剰銆€涓轰簡闃叉鎭舵剰鐨勬搷浣滐紝涓€鑸ā鏉挎柟娉曢兘鍔犱笂final鍏抽敭瀛楋紝涓嶅厑璁歌瑕嗗啓銆?br>鍦ㄧ被鍥句腑杩樻湁涓€涓鑹诧細鍏蜂綋妯℃澘銆侰oncreteClass1鍜孋oncreteClass2灞炰簬鍏蜂綋妯℃澘锛屽疄鐜扮埗绫绘墍瀹氫箟鐨勪竴涓垨澶氫釜鎶借薄鏂规硶锛屼篃灏辨槸鐖剁被瀹氫箟鐨勫熀鏈柟娉曞湪瀛愮被涓緱浠ュ疄鐜般€?br>鎴戜滑鏉ョ湅鍏堕€氱敤浠g爜锛孉bstractClass濡備唬鐮佹竻鍗曞涓嬫墍绀恒€?br>鎶借薄妯℃澘绫?/p>

 1 public abstract class AbstractClass {
 2 
 3     //鍩烘湰鏂规硶
 4     protected abstract void doSomething();
 5     
 6     //鍩烘湰鏂规硶
 7     protected abstract void doAnything();
 8     
 9     //妯$増鏂规硶
10     public void templateMethod(){
11         /*
12          * 璋冪敤鍩烘湰鏂规硶锛屽畬鎴愮浉鍏崇殑閫昏緫
13          */
14         this.doAnything();
15         this.doSomething();
16     }
17 }

聽鍏蜂綋妯℃澘濡備唬鐮佹竻鍗曞涓嬫墍绀恒€?/p>

聽鍏蜂綋妯℃澘绫?/p>

public class ConcreteClass1 extends AbstractClass {

    //瀹炵幇鍩烘湰鏂规硶
    protected void doAnything() {
        //涓氬姟閫昏緫澶勭悊
    }

    protected void doSomething() {
        //涓氬姟閫昏緫澶勭悊
    }

}

&

public class ConcreteClass2 extends AbstractClass {

    //瀹炵幇鍩烘湰鏂规硶
    protected void doAnything() {
        //涓氬姟閫昏緫澶勭悊
    }

    protected void doSomething() {
        //涓氬姟閫昏緫澶勭悊
    }

}

聽鍦烘櫙绫?/p>

public class Client {
    
    public static void main(String[] args) {
        AbstractClass class1 = new ConcreteClass1();
        AbstractClass class2 = new ConcreteClass2();
        
        //璋冪敤妯$増鏂规硶
        class1.templateMethod();
        class2.templateMethod();
    }
}

聽娉ㄦ剰銆€鎶借薄妯℃澘涓殑鍩烘湰鏂规硶灏介噺璁捐涓簆rotected绫诲瀷锛岀鍚堣开绫崇壒娉曞垯锛屼笉闇€瑕佹毚闇茬殑灞炴€ф垨鏂规硶灏介噺涓嶈璁剧疆涓簆rotected绫诲瀷銆傚疄鐜扮被鑻ラ潪蹇呰锛屽敖閲忎笉瑕佹墿澶х埗绫讳腑鐨勮闂?/p>

鏉冮檺銆?/p>

3 妯℃澘鏂规硶妯″紡鐨勫簲鐢?/span>

聽3.1 妯℃澘鏂规硶妯″紡鐨勪紭鐐?/span>

聽鈼?灏佽涓嶅彉閮ㄥ垎锛屾墿灞曞彲鍙橀儴鍒?/p>

鎶婅涓烘槸涓嶅彉閮ㄥ垎鐨勭畻娉曞皝瑁呭埌鐖剁被瀹炵幇锛岃€屽彲鍙橀儴鍒嗙殑鍒欏彲浠ラ€氳繃缁ф壙鏉ョ户缁墿灞曘€傚湪鎮嶉┈妯″瀷渚嬪瓙涓紝鏄笉鏄氨闈炲父瀹规槗鎵╁睍锛熶緥濡傚鍔犱竴涓狧3鍨嬪彿鐨勬倣椹ā鍨嬶紝寰堝鏄撳憖锛屽鍔犱竴涓瓙绫伙紝瀹炵幇鐖剁被鐨勫熀鏈柟娉曞氨鍙互浜嗐€?br>鈼?鎻愬彇鍏叡閮ㄥ垎浠g爜锛屼究浜庣淮鎶?br>鎴戜滑渚嬪瓙涓垰鍒氳蛋杩囩殑寮矾灏辨槸鏈€濂界殑璇佹槑锛屽鏋滄垜浠笉鎶藉彇鍒扮埗绫讳腑锛屼换鐢辫繖绉嶆暎涔辩殑浠g爜鍙戠敓锛屾兂鎯冲悗鏋滄槸浠€涔堟牱瀛愶紵缁存姢浜哄憳涓轰簡淇涓€涓己闄凤紝闇€瑕佸埌澶勬煡鎵剧被浼肩殑浠g爜锛?br>鈼?琛屼负鐢辩埗绫绘帶鍒讹紝瀛愮被瀹炵幇
鍩烘湰鏂规硶鏄敱瀛愮被瀹炵幇鐨勶紝鍥犳瀛愮被鍙互閫氳繃鎵╁睍鐨勬柟寮忓鍔犵浉搴旂殑鍔熻兘锛岀鍚堝紑闂師鍒欍€?br>3.2 妯℃澘鏂规硶妯″紡鐨勭己鐐?/span>

鎸夌収鎴戜滑鐨勮璁′範鎯紝鎶借薄绫昏礋璐e0鏄庢渶鎶借薄銆佹渶涓€鑸殑浜嬬墿灞炴€у拰鏂规硶锛屽疄鐜扮被瀹屾垚鍏蜂綋鐨勪簨鐗╁睘鎬у拰鏂规硶銆備絾鏄ā鏉挎柟娉曟ā寮忓嵈棰犲€掍簡锛屾娊璞$被瀹氫箟浜嗛儴鍒嗘娊璞℃柟娉曪紝鐢卞瓙绫?br>瀹炵幇锛屽瓙绫绘墽琛岀殑缁撴灉褰卞搷浜嗙埗绫荤殑缁撴灉锛屼篃灏辨槸瀛愮被瀵圭埗绫讳骇鐢熶簡褰卞搷锛岃繖鍦ㄥ鏉傜殑椤圭洰涓紝浼氬甫鏉ヤ唬鐮侀槄璇荤殑闅惧害锛岃€屼笖涔熶細璁╂柊鎵嬩骇鐢熶笉閫傛劅銆?br>3.3妯℃澘鏂规硶妯″紡鐨勪娇鐢ㄥ満鏅?/span>

鈼?澶氫釜瀛愮被鏈夊叕鏈夌殑鏂规硶锛屽苟涓旈€昏緫鍩烘湰鐩稿悓鏃躲€?/p>

鈼?閲嶈銆佸鏉傜殑绠楁硶锛屽彲浠ユ妸鏍稿績绠楁硶璁捐涓烘ā鏉挎柟娉曪紝鍛ㄨ竟鐨勭浉鍏崇粏鑺傚姛鑳藉垯鐢卞悇涓瓙绫诲疄鐜般€?br>鈼?閲嶆瀯鏃讹紝妯℃澘鏂规硶妯″紡鏄竴涓粡甯镐娇鐢ㄧ殑妯″紡锛屾妸鐩稿悓鐨勪唬鐮佹娊鍙栧埌鐖剁被涓紝鐒跺悗閫氳繃閽╁瓙鍑芥暟锛堣鈥滄ā鏉挎柟娉曟ā寮忕殑鎵╁睍鈥濓級绾︽潫鍏惰涓恒€?/p>

4 妯℃澘鏂规硶妯″紡鐨勬墿灞?/span>

鍒扮洰鍓嶄负姝紝杩欎袱涓ā鍨嬮兘绋冲畾鍦拌繍琛岋紝绐佺劧鏈変竴澶╋紝鑰佸ぇ鎬ュ寙鍖嗗湴鎵惧埌浜嗘垜锛氣€滅湅浣犳€庝箞璁捐鐨勶紝杞﹀瓙涓€鍚姩锛屽枃鍙氨鐙傚搷锛屽惖姝讳汉浜嗭紒瀹㈡埛鎻愬嚭H1鍨嬪彿鐨勬倣椹枃鍙?br>鎯宠瀹冨搷灏卞搷锛孒2鍨嬪彿鐨勫枃鍙笉瑕佹湁澹伴煶锛岃刀蹇慨鏀逛竴涓嬨€傗€濊嚜宸辨児鐨勭ジ锛屽氨瑕佹兂鍔炴硶瑙e喅瀹冿紝绋嶇◢鎬濊€冧竴涓嬶紝瑙e喅鍔炴硶鏈変簡锛屽厛鐢诲嚭绫诲浘锛屽鍥?br>23绉嶈璁℃ā寮忥紙四锛夛細妯℃澘妯″紡

聽绫诲浘鏀瑰姩浼间箮寰堝皬锛屽湪鎶借薄绫籋ummerModel涓鍔犱簡涓€涓疄鐜版柟娉昳sAlarm锛岀‘瀹氬悇涓瀷鍙风殑鎮嶉┈鏄惁闇€瑕佸0闊筹紝鐢卞悇涓疄鐜扮被瑕嗗啓璇ユ柟娉曪紝鍚屾椂鍏朵粬鐨勫熀鏈柟娉曠敱浜庝笉闇€瑕佸澶栨彁

渚涜闂紝鍥犳涔熻璁′负protected绫诲瀷銆傚叾婧愪唬鐮佸浠g爜娓呭崟銆?br>鎵╁睍鍚庣殑鎶借薄妯℃澘绫?/p>

 1 public abstract class HummerModel {
 2 
 3     /*
 4      * 棣栧厛锛岃繖涓ā鍨嬭鑳藉琚彂鍔ㄨ捣鏉ワ紝鍒鏄墜鎽囧彂鍔紝杩樻槸鐢靛姏鍙戝姩锛屽弽姝?
 5      * 鏄鑳藉鍙戝姩璧锋潵锛岄偅杩欎釜瀹炵幇瑕佸湪瀹炵幇绫婚噷浜?
 6      */
 7     protected abstract void start();
 8     
 9     //鑳藉彂鍔紝閭h繕瑕佽兘鍋滀笅鏉ワ紝閭f墠鏄湡鏈簨
10     protected abstract void stop();
11     
12     //鍠囧彮浼氬嚭澹伴煶锛屾槸婊存淮鍙紝杩樻槸鍝斿摂鍙?/span>
13     protected abstract void alarm();
14     
15     //寮曟搸浼氳桨闅嗛殕鐨勫搷锛屼笉鍝嶉偅鏄亣鐨?/span>
16     protected abstract void engineBoom();
17     
18     //閭fā鍨嬪簲璇ヤ細璺戝惂锛屽埆绠℃槸浜洪€€鐨勶紝杩樻槸鐢靛姏椹卞姩锛屾€讳箣瑕佷細璺?/span>
19     final public void run() {
20         
21         //鍏堝彂鍔ㄦ苯杞?/span>
22         this.start();
23         
24         //寮曟搸寮€濮嬭桨楦?/span>
25         this.engineBoom();
26         
27         //瑕佽瀹冨彨鐨勫氨鏄氨鍙紝鍠囧槢涓嶆兂璁╁畠鍝嶅氨涓嶅搷
28         if(this.isAlarm()){
29             this.alarm();
30         }
31         
32         
33         //鍒拌揪鐩殑鍦板氨鍋滆溅
34         this.stop();
35     }
36     
37     //閽╁瓙鏂规硶锛岄粯璁ゅ枃鍙槸浼氬搷鐨?/span>
38     protected  boolean isAlarm(){
39         return true;
40     }
41 }

聽鍦ㄦ娊璞$被涓紝isAlarm鏄竴涓疄鐜版柟娉曘€傚叾浣滅敤鏄ā鏉挎柟娉曟牴鎹叾杩斿洖鍊煎喅瀹氭槸鍚﹁鍝嶅枃鍙紝瀛愮被鍙互瑕嗗啓璇ヨ繑鍥炲€硷紝鐢变簬H1鍨嬪彿鐨勫枃鍙槸鎯宠瀹冨搷灏卞搷锛屼笉鎯宠瀹冨搷灏变笉鍝嶏紝鐢变汉鎺у埗锛屽叾婧愪唬鐮佸浠g爜娓呭崟銆?/p>

浠g爜娓呭崟10-10 鎵╁睍鍚庣殑H1鎮嶉┈

 1 public class HummerH1Model extends HummerModel {
 2     private boolean alarmFlag = true;  //鏄惁瑕佸搷鍠囧彮
 3     
 4     @Override
 5     protected void alarm() {
 6         System.out.println("鎮嶉┈H1楦g瑳...");
 7     }
 8 
 9     @Override
10     protected void engineBoom() {
11         System.out.println("鎮嶉┈H1寮曟搸澹伴煶鏄繖鏍峰湪...");
12     }
13 
14     @Override
15     protected void start() {
16         System.out.println("鎮嶉┈H1鍙戝姩...");
17     }
18 
19     @Override
20     protected void stop() {
21         System.out.println("鎮嶉┈H1鍋滆溅...");
22     }
23     
24     protected boolean isAlarm() {
25         return this.alarmFlag;
26     }
27 
28     //瑕佷笉瑕佸搷鍠囧彮锛屾槸鏈夊鎴风殑鏉ュ喅瀹氱殑
29     public void setAlarm(boolean isAlarm){
30         this.alarmFlag = isAlarm;
31     }
32 
33 }

鍙璋冪敤H1鍨嬪彿鐨勬倣椹紝榛樿鏄湁鍠囧彮鍝嶇殑锛屽綋鐒朵綘鍙互涓嶈鍠囧彮鍝嶏紝閫氳繃
isAlarm(false)灏卞彲浠ュ疄鐜般€侶2鍨嬪彿鐨勬倣椹槸娌℃湁鍠囧彮澹板搷鐨勶紝鍏舵簮浠g爜濡備唬鐮佹竻鍗?0-11鎵€
绀恒€?br>浠g爜娓呭崟10-11 鎵╁睍鍚庣殑H2鎮嶉┈

 1 public class HummerH2Model extends HummerModel {
 2 
 3     protected void alarm() {
 4         System.out.println("鎮嶉┈H2楦g瑳...");
 5     }
 6 
 7     protected void engineBoom() {
 8         System.out.println("鎮嶉┈H2寮曟搸澹伴煶鏄繖鏍峰湪...");
 9     }
10     
11     protected void start() {
12         System.out.println("鎮嶉┈H2鍙戝姩...");
13     }
14 
15     protected void stop() {
16         System.out.println("鎮嶉┈H2鍋滆溅...");
17     }
18     
19     
20     //榛樿娌℃湁鍠囧彮鐨?/span>
21     protected boolean isAlarm() {        
22         return false;
23     }
24 }

H2鍨嬪彿鐨勬倣椹缃甶sAlarm()鐨勮繑鍥炲€间负false锛屼篃灏辨槸鍏抽棴浜嗗枃鍙姛鑳姐€傚満鏅被浠g爜濡備唬鐮佹竻鍗?0-12鎵€绀?/p>

聽鎵╁睍鍚庣殑鍦烘櫙绫?/p>

 1 public class Client {
 2 
 3     public static void main(String[] args) throws IOException {
 4         System.out.println("-------H1鍨嬪彿鎮嶉┈--------");
 5         System.out.println("H1鍨嬪彿鐨勬倣椹槸鍚﹂渶瑕佸枃鍙0鍝嶏紵0-涓嶉渶瑕?  1-闇€瑕?);
 6         String type=(new BufferedReader(new InputStreamReader(System.in))).readLine();
 7         HummerH1Model h1 = new HummerH1Model();
 8         if(type.equals("0")){  
 9             h1.setAlarm(false);
10         }
11         h1.run();
12         
13         System.out.println("\n-------H2鍨嬪彿鎮嶉┈--------");
14         HummerH2Model h2 = new HummerH2Model();
15         h2.run();  
16     }
17 
18 }

聽杩愯鏄渶瑕佷氦浜掔殑锛岄鍏堬紝瑕佹眰杈撳叆H1鍨嬪彿鐨勬倣椹槸鍚︽湁澹伴煶锛屽涓嬫墍绀?

-------H1鍨嬪彿鎮嶉┈--------
H1鍨嬪彿鐨勬倣椹槸鍚﹂渶瑕佸枃鍙0鍝嶏紵0-涓嶉渶瑕?1-闇€瑕?
杈撳叆鈥?/span>0鈥濆悗鐨勮繍琛岀粨鏋滃涓嬫墍绀猴細
-------H1鍨嬪彿鎮嶉┈--------
H1鍨嬪彿鐨勬倣椹槸鍚﹂渶瑕佸枃鍙0鍝嶏紵0-涓嶉渶瑕?1-闇€瑕?
0
鎮嶉┈H1鍙戝姩...
鎮嶉┈H1寮曟搸澹伴煶鏄繖鏍风殑...
鎮嶉┈H1鍋滆溅...
-------H2鍨嬪彿鎮嶉┈--------
鎮嶉┈H2鍙戝姩...
鎮嶉┈H2寮曟搸澹伴煶鏄繖鏍风殑...
鎮嶉┈H2鍋滆溅...
杈撳叆鈥?/span>1鈥濆悗鐨勮繍琛岀粨鏋滃涓嬫墍绀猴細
-------H1鍨嬪彿鎮嶉┈--------
H1鍨嬪彿鐨勬倣椹槸鍚﹂渶瑕佸枃鍙0鍝嶏紵0-涓嶉渶瑕?1-闇€瑕?
1
鎮嶉┈H1鍙戝姩...
鎮嶉┈H1寮曟搸澹伴煶鏄繖鏍风殑...
鎮嶉┈H1楦g瑳...
鎮嶉┈H1鍋滆溅...
-------H2鍨嬪彿鎮嶉┈--------
鎮嶉┈H2鍙戝姩...
鎮嶉┈H2寮曟搸澹伴煶鏄繖鏍风殑...
鎮嶉┈H2鍋滆溅...

鐪嬪埌娌★紝H1鍨嬪彿鐨勬倣椹槸鐢卞鎴疯嚜宸辨帶鍒舵槸鍚﹁鍝嶅枃鍙紝涔熷氨鏄澶栫晫鏉′欢鏀瑰彉锛屽奖鍝嶅埌妯℃澘鏂规硶鐨勬墽琛屻€傚湪鎴戜滑鐨勬娊璞$被涓璱sAlarm鐨勮繑鍥炲€煎氨鏄奖鍝嶄簡妯℃澘鏂规硶鐨勬墽琛岀粨
鏋滐紝璇ユ柟娉曞氨鍙仛閽╁瓙鏂规硶锛圚ook Method锛夈€傛湁浜嗛挬瀛愭柟娉曟ā鏉挎柟娉曟ā寮忔墠绠楀畬缇庯紝澶у鍙互鎯虫兂锛岀敱瀛愮被鐨勪竴涓柟娉曡繑鍥炲€煎喅瀹氬叕鍏遍儴鍒嗙殑鎵ц缁撴灉锛屾槸涓嶆槸寰堟湁鍚稿紩鍔涘憖锛?br>妯℃澘鏂规硶妯″紡灏辨槸鍦ㄦā鏉挎柟娉曚腑鎸夌収涓€瀹氱殑瑙勫垯鍜岄『搴忚皟鐢ㄥ熀鏈柟娉曪紝鍏蜂綋鍒板墠闈㈤偅涓緥瀛愶紝灏辨槸run()鏂规硶鎸夌収瑙勫畾鐨勯『搴忥紙鍏堣皟鐢╯tart()锛岀劧鍚庡啀璋冪敤engineBoom()锛屽啀璋冪敤
alarm()锛屾渶鍚庤皟鐢╯top()锛夎皟鐢ㄦ湰绫荤殑鍏朵粬鏂规硶锛屽苟涓旂敱isAlarm()鏂规硶鐨勮繑鍥炲€肩‘瀹歳un()涓殑鎵ц椤哄簭鍙樻洿銆?/p>

5 鏈€浣冲疄璺?/span>

聽鍒濈骇绋嬪簭鍛樺湪鍐欑▼搴忕殑鏃跺€欑粡甯镐細闂珮鎵嬧€滅埗绫绘€庝箞璋冪敤瀛愮被鐨勬柟娉曗€濄€傝繖涓棶棰樺緢鏈夋櫘閬嶆€э紝鍙嶆鎴戞槸琚棶杩囧ソ鍑犲洖锛岄偅涔堢埗绫绘槸鍚﹀彲浠ヨ皟鐢ㄥ瓙绫荤殑鏂规硶鍛紵鎴戠殑鍥炵瓟鏄兘锛屼絾寮虹儓鍦般€佹瀬搴﹀湴涓嶅缓璁繖涔堝仛锛岄偅璇ユ€庝箞鍋氬憿?

鈼?鎶婂瓙绫讳紶閫掑埌鐖剁被鐨勬湁鍙傛瀯閫犱腑锛岀劧鍚庤皟鐢ㄣ€?br>鈼?浣跨敤鍙嶅皠鐨勬柟寮忚皟鐢紝浣犱娇鐢ㄤ簡鍙嶅皠杩樻湁璋佷笉鑳借皟鐢ㄧ殑锛燂紒
鈼?鐖剁被璋冪敤瀛愮被鐨勯潤鎬佹柟娉曘€?br>杩欎笁绉嶉兘鏄埗绫荤洿鎺ヨ皟鐢ㄥ瓙绫荤殑鏂规硶锛屽ソ鐢ㄤ笉锛熷ソ鐢紒瑙e喅闂浜嗗悧锛熻В鍐充簡锛侀」鐩腑鍏佽浣跨敤涓嶏紵涓嶅厑璁革紒鎴戝氨涓€鐩存病鏈夋悶鎳備负浠€涔堣鐢ㄧ埗绫昏皟鐢ㄥ瓙绫荤殑鏂规硶銆傚鏋滀竴瀹氳璋冪敤
瀛愮被锛岄偅涓轰粈涔堣缁ф壙瀹冨憿锛熸悶涓嶆噦銆傚叾瀹炶繖涓棶棰樺彲浠ユ崲涓搴﹀幓鐞嗚В锛岀埗绫诲缓绔嬫鏋讹紝瀛愮被鍦ㄩ噸鍐欎簡鐖剁被閮ㄥ垎鐨勬柟娉曞悗锛屽啀璋冪敤浠庣埗绫荤户鎵跨殑鏂规硶锛屼骇鐢熶笉鍚岀殑缁撴灉锛堣€岃繖姝f槸妯?br>鏉挎柟娉曟ā寮忥級銆傝繖鏄笉鏄篃鍙互鐞嗚В涓虹埗绫昏皟鐢ㄤ簡瀛愮被鐨勬柟娉曞憿锛熶綘淇敼浜嗗瓙绫伙紝褰卞搷浜嗙埗绫昏涓虹殑缁撴灉锛屾洸绾挎晳鍥界殑鏂瑰紡瀹炵幇浜嗙埗绫讳緷璧栧瓙绫荤殑鍦烘櫙锛屾ā鏉挎柟娉曟ā寮忓氨鏄繖绉嶆晥鏋溿€?br>妯℃澘鏂规硶鍦ㄤ竴浜涘紑婧愭鏋朵腑搴旂敤闈炲父澶氾紝瀹冩彁渚涗簡涓€涓娊璞$被锛岀劧鍚庡紑婧愭鏋跺啓浜嗕竴鍫嗗瓙绫汇€傚湪銆娒椕椕?In Action銆嬩腑灏辫鏄庝簡锛屽鏋滀綘闇€瑕佹墿灞曞姛鑳斤紝鍙互缁ф壙杩欎釜鎶借薄绫伙紝鐒跺悗
瑕嗗啓protected鏂规硶锛屽啀鐒跺悗灏辨槸璋冪敤涓€涓被浼糴xecute鏂规硶锛屽氨瀹屾垚浣犵殑鎵╁睍寮€鍙戯紝闈炲父瀹规槗鎵╁睍鐨勪竴绉嶆ā寮忋€?/p>