锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
[ Program To An Interface, Not An Implementation ]
n聽聽聽聽聽聽聽聽
鎺ュ彛
鏄竴涓璞″湪瀵瑰叾瀹冪殑瀵硅薄榪涜璋冪敤鏃舵墍鐭ラ亾鐨勬柟娉曢泦鍚堛?/span>
n聽聽聽聽聽聽聽聽
涓涓璞″彲浠ユ湁澶氫釜鎺ュ彛錛堝疄闄呬笂錛屾帴鍙f槸瀵硅薄鎵鏈夋柟娉曠殑涓涓瓙闆嗭級
n聽聽聽聽聽聽聽聽
綾誨瀷
鏄璞$殑涓涓壒瀹氱殑鎺ュ彛銆?/span>
n聽聽聽聽聽聽聽聽
涓嶅悓鐨勫璞″彲浠ュ叿鏈夌浉鍚岀殑綾誨瀷錛岃屼笖涓涓璞″彲浠ュ叿鏈夊涓笉鍚岀殑綾誨瀷銆?/span>
n聽聽聽聽聽聽聽聽
涓涓璞′粎鑳介氳繃鍏舵帴鍙f墠浼?xì)琚叾瀹冨璞℃墍浜嗚В銆?/span>
n聽聽聽聽聽聽聽聽
鏌愮鎰忎箟涓婏紝鎺ュ彛鏄互涓縐嶉潪甯稿眬闄愮殑鏂瑰紡錛屽皢鈥滄槸涓縐?/span>
鈥?/span>
鈥濊〃杈句負(fù)鈥滀竴縐嶆敮鎸佽鎺ュ彛鐨?/span>
鈥?/span>
鈥濄?/span>
n聽聽聽聽聽聽聽聽
鎺ュ彛鏄疄鐜版彃浠跺寲錛?/span>
pluggability
錛夌殑鍏抽敭
n聽聽聽聽聽聽聽聽
瀹炵幇緇ф壙
錛?i>綾葷戶鎵?/i>錛夛細(xì)涓涓璞$殑瀹炵幇鏄牴鎹彟涓涓璞$殑瀹炵幇鏉ュ畾涔夌殑銆?/span>
n聽聽聽聽聽聽聽聽
鎺ュ彛緇ф壙
錛?i>瀛愮被鍨嬪寲錛夛細(xì)鎻忚堪浜嗕竴涓璞″彲鍦ㄤ粈涔堟椂鍊欒鐢ㄦ潵鏇夸唬鍙︿竴涓璞°?/span>
n聽聽聽聽聽聽聽聽
C++
鐨勭戶鎵挎満鍒舵棦鎸囩被緇ф壙錛屽張鎸囨帴鍙g戶鎵褲?/span>
n聽聽聽聽聽聽聽聽
C++
閫氳繃緇ф壙綰櫄綾繪潵瀹炵幇鎺ュ彛緇ф壙銆?/span>
n聽聽聽聽聽聽聽聽
Java
瀵規(guī)帴鍙g戶鎵垮叿鏈夊崟鐙殑璇█鏋勯犳柟寮忥紞
Java
鎺ュ彛銆?/span>
n聽聽聽聽聽聽聽聽
Java
鎺ュ彛鏋勯犳柟寮忔洿鍔犳槗浜庤〃杈懼拰瀹炵幇閭d簺涓撴敞浜庡璞℃帴鍙g殑璁捐銆?/span>
n聽聽聽聽聽聽聽聽
浼樼偣錛?/span>
F聽聽聽聽聽聽聽
Client
涓嶅繀鐭ラ亾鍏朵嬌鐢ㄥ璞$殑鍏蜂綋鎵灞炵被銆?/span>
F聽聽聽聽聽聽聽
涓涓璞″彲浠ュ緢瀹規(guī)槗鍦拌錛堝疄鐜頒簡鐩稿悓鎺ュ彛鐨勶級鐨勫彟涓涓璞℃墍鏇挎崲銆?/span>
F聽聽聽聽聽聽聽
瀵硅薄闂寸殑榪炴帴涓嶅繀紜粦瀹氾紙
hardwire
錛夊埌涓涓叿浣撶被鐨勫璞′笂錛屽洜姝ゅ鍔犱簡鐏墊椿鎬с?/span>
F聽聽聽聽聽聽聽
鏉炬暎钘曞悎錛?/span>
loosens coupling
錛夈?/span>
F聽聽聽聽聽聽聽
澧炲姞浜嗛噸鐢ㄧ殑鍙兘鎬с?/span>
F聽聽聽聽聽聽聽
鎻愰珮浜嗭紙瀵硅薄錛夌粍鍚堢殑鏈虹巼錛屽洜涓鴻鍖呭惈瀵硅薄鍙互鏄換浣曞疄鐜頒簡涓涓寚瀹氭帴鍙g殑綾匯?/span>
n聽聽聽聽聽聽聽聽
緙虹偣錛?/span>
F聽聽聽聽聽聽聽
璁捐鐨勫鏉傛х暐鏈夊鍔?/span>
錛堣瘧鑰呮敞錛氭帴鍙h〃紺衡?/span>
鈥?/span>
鍍?/span>
鈥?/span>
鈥濓紙
LikeA
錛夌殑鍏崇郴錛岀戶鎵胯〃紺衡?/span>
鈥?/span>
鏄?/span>
鈥?/span>
鈥濓紙
IsA
錛夌殑鍏崇郴錛岀粍鍚堣〃紺衡?/span>
鈥?/span>
鏈?/span>
鈥?/span>
鈥濓紙
HasA
錛夌殑鍏崇郴銆傦級
/**
聽聽聽聽 * Interface IManeuverable provides the specification
聽聽聽聽 * for a maneuverable vehicle.
聽聽聽聽 */
聽聽聽聽
public
interface
IManeuverable
聽聽聽聽 {
聽聽聽聽聽聽聽聽
public
void left();
聽聽聽聽聽聽聽聽
public
void right();
聽聽聽聽聽聽聽聽
public
void forward();
聽聽聽聽聽聽聽聽
public
void reverse();
聽聽聽聽聽聽聽聽
public
void climb();
聽聽聽聽聽聽聽聽
public
void dive();
聽聽聽聽聽聽聽聽
public
void setSpeed(double speed);
聽聽聽聽聽聽聽聽
public
double getSpeed();
聽聽聽聽 }
聽聽聽聽
public
class
Car
聽聽聽聽聽聽聽聽
implements IManeuverable { // Code here. }
聽聽聽聽
public
class
Boat
聽聽聽聽聽聽聽聽
implements IManeuverable { // Code here. }
聽聽聽聽
public
class
Submarine
聽聽聽聽聽聽聽聽
implements IManeuverable { // Code here. }
n聽聽聽聽聽聽聽聽
璇ユ柟娉曟槸鎸囧叾瀹冪殑涓浜涚被鍙互榪涜浜ら氬伐鍏風(fēng)殑椹鵑┒錛岃屼笉蹇呭叧蹇冨叾瀹為檯涓婃槸浠涔堬紙姹借濺錛岃疆鑸癸紝娼滆墖錛夋垨鑰呭叾鍦ㄤ粈涔堢戶鎵挎灦鏋勯噷闈€?/span>
聽聽聽聽
public
void travel(IManeuverable vehicle)
聽聽聽聽
{
聽聽聽聽聽聽聽聽 vehicle.setSpeed(35.0);
聽聽聽聽聽聽聽聽 vehicle.forward();
聽聽聽聽聽聽聽聽 vehicle.left();
聽聽聽聽聽聽聽聽 vehicle.climb();
聽聽聽聽 }
]]>
]]>
鎺ュ彛
瀹炵幇緇ф壙鍜屾帴鍙g戶鎵?/font>
鎺ュ彛鐨勫ソ澶?/font>
鎺ュ彛瀹炰緥
]]>
]]>
涓浜?span lang="EN-US">
璁捐
娉曞垯
Bob Tarr 钁?/span>
outmyth
璇?/span>
mahope
鏍?/span>聽
n聽聽聽聽聽聽聽聽
[Minimize The Accessibility of Classes and Members]
n聽聽聽聽聽聽聽聽 Tony Hoare: 鈥?/span> 鎶借薄 璧鋒簮浜庡鐪熷疄涓栫晫涓殑瀵硅薄銆佷簨鎬併佽繃紼嬩箣闂寸殑鐩鎬技鎬х殑璁よ瘑錛屼互鍙婂湪鑱氶泦榪欎簺鐩鎬技鎬х殑鍚屾椂蹇界暐宸紓鎬х殑鍐沖績 鈥? 錛?/span>
n聽聽聽聽聽聽聽聽 Grady Booch: 鈥?/span> 鎶借薄 琛ㄧず涓涓璞″尯鍒笌鍏朵粬綾誨埆鐨勫璞$殑鏈川鐗瑰緛錛屼粠鑰岀浉瀵逛簬瑙傚療鑰呯殑瑙掑害鏉ヨ錛屼負(fù)鍏舵彁渚涗簡鏄庣‘瀹氫箟鐨勬蹇佃竟鐣?/span> 鈥?/span> 錛?/span>
n聽聽聽聽聽聽聽聽 鎶借薄 鏄鐞嗗鏉備簨鐗╃殑鍩烘湰鏂規(guī)硶涔嬩竴錛?/span>
n聽聽聽聽聽聽聽聽 鎶借薄 鍏蟲敞瀵硅薄鐨勫閮ㄨ鍥懼茍灝嗗叾琛屼負(fù)涓庡畠鐨勫疄鐜伴殧紱誨紑鏉ャ?/span>
n聽聽聽聽聽聽聽聽 Grady Booch: 鈥?/span> 灝佽 鏄垝鍒?i style="mso-bidi-font-style: normal">鎶借薄鐨勫厓绱犵殑榪囩▼錛岃繖浜涘厓绱犳瀯鎴愪簡鎶借薄鐨勭粨鏋勫拰琛屼負(fù)錛涘皝瑁呯殑鍔熻兘鏄皢鎶借薄鐨勫綰︽帴鍙d笌鍏跺疄鐜板垎寮 鈥?/span> 錛?/span>
n聽聽聽聽聽聽聽聽 Craig Larman: 鈥?/span> 灝佽 鏄殣钘忓璞$殑鏁版嵁銆佸唴閮ㄧ粨鏋勫拰瀹炵幇緇嗚妭鐨勬満鍒躲傛墍鏈変笌瀵硅薄鐨勪氦浜掗兘鏄氳繃鍏叡鎿嶄綔榪欎釜鎺ュ彛 鈥?/span> 錛?/span>
n聽聽聽聽聽聽聽聽 綾誨簲璇ユ槸涓嶉忔槑鐨勶紱
n聽聽聽聽聽聽聽聽 綾諱笉搴旀毚闇插叾鍐呴儴瀹炵幇緇嗚妭銆?/span>
n聽聽聽聽聽聽聽聽 灝藉彲鑳界浣跨敤縐佹湁鎴愬憳鍜岀浉搴旂殑璁塊棶鍣?/span> / 淇敼鍣紙 accessors and mutators 錛?/span>
n聽聽聽聽聽聽聽聽 涓句緥錛?/span>
鏇挎崲
聽public double speed;
涓?/span>
聽聽聽聽
private
double speed;
聽聽聽聽
public
double getSpeed()
聽聽聽聽 {
聽聽聽聽聽聽聽聽
return (speed);
聽聽聽聽 }
聽聽聽聽
public
void setSpeed(double newSpeed)
聽聽聽聽 {
聽聽聽聽聽聽聽聽 speed = newSpeed;
}
n聽聽聽聽聽聽聽聽 浣犲彲浠ュ湪鍊間笂闄勫姞綰︽潫鏉′歡
聽聽聽聽
public
void setSpeed(double newSpeed)
聽聽聽聽 {
聽聽聽聽聽聽聽聽
if (newSpeed < 0)
聽聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽 sendErrorMessage(...);
聽聽聽聽聽聽聽聽聽聽聽聽聽 newSpeed = Math.abs(newSpeed);
聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽 speed = newSpeed;
聽聽聽聽 }
n聽聽聽聽聽聽聽聽 濡傛灉浣跨敤浣犵殑綾葷殑鐢ㄦ埛鐩存帴璁塊棶綾葷殑瀛楁錛岄偅涔堜粬浠篃浼?xì)鎷呰礋妫鏌ョ害鏉熸潯浠剁殑璐d換
n聽聽聽聽聽聽聽聽 浣犲彲浠ユ敼鍙樼被鐨勫唴閮ㄨ〃紺鴻屼笉鐢ㄦ敼鍙樻帴鍙?/span>
聽聽聽聽
// Now using metric units (kph, not mph)
聽聽聽聽
public
void setSpeedInMPH(double newSpeed)
聽聽聽聽 {
聽聽聽聽聽聽聽聽 speedInKPH = convert(newSpeed);
聽聽聽聽 }
聽聽聽聽
public
void setSpeedInKPH(double newSpeed)
聽聽聽聽 {
聽聽聽聽聽聽聽聽 speedInKPH = newSpeed;
聽聽聽聽 }
n聽聽聽聽聽聽聽聽 浣犲彲浠ユ墽琛屼換鎰忕殑闄勫姞鏁堟灉
聽聽聽聽
public
double setSpeed(double newSpeed)
聽聽聽聽 {
聽聽聽聽聽聽聽聽 speed = newSpeed;
聽聽聽聽聽聽聽聽 notifyObservers();
聽聽聽聽 }
n聽聽聽聽聽聽聽聽 濡傛灉浣跨敤浣犵殑綾葷殑鐢ㄦ埛鐩存帴璁塊棶綾葷殑瀛楁錛岄偅涔堜粬浠篃浼?xì)鎷呰礋鎵ц闄勫姞鏁堟灉鐨勮矗鋼Q