锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 榪欎竴绔犲叧娉ㄧ殑閲嶇偣鏄?strong>鍏崇郴錛屼互鍙婃庢牱涓洪敊緇煎鏉傜殑鍏崇郴寤虹珛妯″瀷錛屽彟澶栵紝鎵鏈夌殑鎻掑浘閮芥潵鑷師涔︼紙銆?/span>Analysis Patterns錛?/span>Reusable Object Models銆嬶級錛屽茍閬靛驚UML鏍囧噯銆?/span> 鍦ㄨ繖涓绔犱腑錛岄鍏堟垜浠帴瑙﹀埌鏄槸Party妯″紡錛屽湪榪涜緋葷粺鍒嗘瀽鍜屾蹇墊ā鍨嬭璁$殑鏃跺欙紝緇忓父鍙戠幇浜哄拰鍚勭鍚勬牱鐨勭粍緇囨湁鐫鍚屾牱鐨勮涓?/em>錛屼緥濡傦紝鍥哄畾鐢佃瘽鐨勮璐瑰彲鑳芥槸閽堝涓漢錛屼篃鍙兘鏄竴涓崟浣嶏紱闇瑕佸悇縐嶆湇鍔$殑鏃跺欙紝浣犲彲鑳芥眰鍔╀簬涓涓湇鍔″叕鍙革紝鎴栬呮湇鍔″叕鍙鎬竴涓壒瀹氱殑涓氬姟鍛樸傛諱箣錛屽洜涓轟漢錛?strong>Person錛夊拰緇勭粐錛?/span>Organization錛夎〃鐜頒笂鐨勪竴鑷存э紝濡備笅鍥炬墍瑙侊紝鎴戜滑浠庝腑鎶借薄鍑?/span>Party錛屼綔涓?/span>Person鍜?/span>Organization鐨勬娊璞$埗綾匯?/span> 絎簩姝ワ紝濡傛灉鎴戜滑鎶婃敞鎰忓姏杞Щ鍒扮粍緇囷紙Organization錛夌殑鍐呴儴緇撴瀯錛屽氨浼氬彂鐜頒竴浜涙湁瓚g殑闂錛岄氬父鏈甯歌鐨勪竴縐嶇粨鏋勬槸閲戝瓧濉旂粨鏋勶紝鍥犳寤烘ā鏃跺彲鑳芥寜鐓ц繖鏍風殑緇撴瀯寤虹珛綰挎х殑妯″瀷錛屼緥濡傦細 榪欐牱鐨勬ā鍨嬪茍娌℃湁閿欒錛屼絾鏄湁緙洪櫡錛岄鍏堜笉鑳芥弧瓚蟲瘮杈冨鏉傜殑緇勭粐鍏崇郴錛屾洿涓ラ噸鐨勬槸錛屼竴鏃?strong>闇瑕佹洿澶氱殑灞傛鍏崇郴錛屼緥濡傚瓨鍦ㄩ儴闂ㄧ洿鎺ヤ笂涓嬬駭鍏崇郴浠ュ強鍖哄煙闄勫睘綆$悊鏂瑰紡錛屽繀灝嗗紩璧鋒暣涓ā鍨嬬殑鏇存敼錛屽緋葷粺鐨勫獎鍝嶅彲鎯寵岀煡錛屽湪榪欑鎯呭喌涓嬶紝鏈閫氬父鐨勬敼榪涙帾鏂芥槸寮曞叆灞傛鍏崇郴錛屽涓嬪浘鎵紺猴細 閫氳繃澧炲姞鏂扮殑鍏寵仈鍏崇郴錛屽彲浠ョ伒媧誨疄鐜扮粍緇囷紙Organization錛変箣闂寸殑鍚勭鍏崇郴浠ュ強鍙兘鐨勫彉鍖栥傚湪涓婂浘涓紝{hierarchy}鏄竴涓害鏉燂紙constraint錛夋潵闄愬畾鍏崇郴銆?/span> 絎笁姝ワ紝鍦ㄤ竴鑸殑鎯呭喌涓嬶紝浠ヤ笂鐨勬ā寮忓凡緇忚凍澶熻В鍐抽棶棰橈紝浣嗗綋榪欐牱鐨勫眰嬈″拰緇勭粐鍏崇郴寰堝鑰屼笖澶嶆潅鏃訛紙瓚呰繃涓ょ錛夛紝渚嬪鐜板湪嫻佽鐨勭煩闃電鐞嗭紝灝卞彲浠ュ皢鍏崇郴鏈韓鎶藉彇鍑烘潵鐙珛澶勭悊錛屽涓嬪浘鎵紺猴紝浣滆呮鏃惰冭檻鍒扮粍緇囩粨鏋勭殑鏈夋晥鏃舵錛屾墍浠ュ姞鍏ヤ簡涓涓椂闂存灞炴ф潵璁板綍緇勭粐緇撴瀯鐨勫瓨鍦ㄦ椂闂淬?/p>
璇鋒敞鎰忥紝鍦ㄨ繖涓ā寮忎腑錛?/span>Organization Structure鎵嶆槸妯″紡鐨勬牳蹇冿紝鍦ㄧ郴緇熶腑錛岀敱涓や釜Organization鐨勫疄渚嬶紙鍒嗗埆鍏呭綋parent鍜?/span>subsidiary錛夛紝浠ュ強涓涓?/span>Type瀹炰緥鏉ヨ鏄庤緇撴瀯鐨勭被鍨嬨傚湪榪欐牱鐨勭粨鏋勪腑錛屽彲鑳藉瓨鍦ㄨ澶氱殑瑙勫垯錛?strong>Rule錛夛紝榪欎簺瑙勫垯鍙互鏍規嵁鎯呭喌鍒嗗埆澶勭悊錛氬鏋?/span>Type寰堝錛岃屼笖瑙勫垯涓昏璺?/span>Type鏈夊叧錛屽氨鍒嗛厤緇欎笌Type鐩稿叧鑱旓紱濡傛灉Type騫朵笉澶氾紝浣嗕富瑕佹牴鎹?/span>Organization鐨勫瓙綾誨瀷鍙樺寲錛屽氨鍙互鍒嗗竷鍒?/span>Organization鐨勫瓙綾誨瀷涓?/span> 絎洓姝ワ紝浠庣涓姝ョ湅鍒幫紝Party鏄?strong>Person鍜?/span>Organization鐨勬娊璞$埗綾伙紝鍥犳鎶?/span>Party浠e叆涓婇潰鐨勬ā寮忥紙鏈夌偣璞℃垜浠皬鏃朵警浠f暟閲屽父鐢ㄧ殑浠e叆錛夛紝姝e紡褰㈡垚璐d換錛?/span>Accountability錛夋ā寮忋?/span> 鍑虹幇榪欐牱涓縐嶆兂娉曟槸鑰冭檻鍒頒互涓嬫儏鍐碉細褰?/span>Accountablity Type鐨勬暟閲忔瘮Accountability鐨勬暟閲忓寰堝鐨勬椂鍊欙紝澶勭悊Accountablity Type鐨勮鍒欎篃鍙樺緱鏇翠負澶嶆潅錛岃瑙e喅榪欐牱鐨勯棶棰橈紝灝卞彲浠ュ紩鍏ョ煡璇嗗眰鍜屾搷浣滃眰鐨勫垎紱匯?/span> 鐢變笅鍥懼彲瑙侊紝鐢ㄨ櫄綰塊殧紱誨紑鐨勶紝灝辨槸鐭ヨ瘑灞傦紙Knowledge level錛夊拰鎿嶄綔灞傦紙Operational level錛夛紝鍦ㄨ繖涓ā鍨嬩腑錛岀煡璇嗗眰錛?/span>Knowledge level錛夌敱涓変釜綾誨崗浣滃畬鎴愶紝瀹冧滑鍒嗗埆鏄?/span>Accountablity Type銆?/span>Connection Rule銆?/span>Party Type錛屽湪Connection Rule涓畾涔夊悎娉曠殑Party鍏崇郴瑙勫垯錛屽茍閫氳繃Accountablity Type瀵?/span>Accountablity榪涜鍒涘緩鏃剁殑鍚堟硶鎬ф楠屻傚畠鐨勫彟涓涓ソ澶勫氨鏄紝鍙互灝嗙煡璇嗗眰鐨勫疄渚嬪寲鐙珛鍑烘潵錛屼綔涓烘搷浣滃眰錛?/span>Operational level錛夎繍琛屾椂鐨勯厤緗紱鎹㈠彞璇濊錛屽綋鐭ヨ瘑灞傜殑瑙勫垯鏀瑰彉鏃訛紝緋葷粺鐨勮涓哄皢琚敼鍙橈紝鑰屼笉闇瑕佷換浣曞叾浠栦唬鐮佺殑鏀瑰姩錛岃繖褰撶劧鏄竴縐嶆瘮杈冪悊鎯沖寲鐨勬儏鍐點?/span> 鐢辨鎯沖埌錛屾瀯寤轟笓瀹剁郴緇熺殑璁捐鎬濊礬涔熷彲浠ヤ粠榪欎釜妯″紡寰楀埌涓浜涘惎鍙戯紝榪欐槸絎旇呬竴鏃剁殑鎰熻Е銆?/p>
鍦ㄥ師涔︿腑錛屽浣曞疄鐜拌繖鏍風殑妯″瀷鎻愬緱姣旇緝妯$硦錛屼絾鏄瑪鑰呰涓猴紝鍙互灝嗗畠浠綔涓烘甯哥殑妯″瀷鏉ュ疄鐜幫紝涓や釜灞傛鐨勫尯鍒嗗彧鏄〃鏄庡畠浠悇鑷媴璐熺殑浠誨姟鍜屽湴浣嶄笉鍚屻傜煡璇嗗眰鍊懼悜浜庢弿榪扮郴緇熷彲鑳藉瓨鍦ㄧ殑鍚勭褰㈠紡錛屽茍璁懼畾鍒ゆ柇緋葷粺鏄惁鏈夋晥鐨勫悇縐嶈鍒欙紱鎿嶄綔灞傚垯鎻忚堪鍦ㄨ繖鏍風殑閰嶇疆涓嬬郴緇熷疄闄呯殑琛屼負銆傞氳繃鏀瑰彉鍐呭湪鐨勯厤緗潵鏀瑰彉澶栧湪鐨勮涓猴紝灝辨槸榪欎釜妯″紡鐨勭洰鐨勩?/p>
鐢變簬榪欎釜妯″紡鐨勭壒鐐癸紝鏀瑰彉緋葷粺琛屼負鏃朵笉蹇呮洿鏀規搷浣滃眰鐨勪唬鐮侊紝浣嗘槸錛屽茍涓嶆剰鍛崇潃鏀瑰彉緋葷粺琛屼負榪炴祴璇曚篃涓嶅繀瑕佸仛銆傚悓鏍鳳紝涔熼渶瑕佽皟璇曘侀厤緗鐞嗐?/p>
浣滆呬篃鎻愬埌錛岃繖鏍風殑妯″紡鐢ㄨ搗鏉ュ茍涓嶈交鏉撅紝鐢氳嚦鍦ㄤ竴鑸殑緋葷粺涓篃涓嶅繀瑕侊紝浣嗗綋浣犲彂鐜版湁蹇呰鐢ㄥ畠鐨勬椂鍊欙紝鍒姽璞紙鎰熻璞$敤闄嶈惤浼炰竴鏍鳳級錛?/p>
浠庣畝鍗曞埌澶嶆潅錛屽墠闈㈠垎浜旀浠嬬粛浜嗛傜敤浜庤В鍐?/span>Party鍙婂叾鍏崇郴鐨勫悇縐嶆ā寮忥紝姣忕鎺ㄨ崘鐨勬ā寮忛兘鏈夊叾琛ㄧ幇鐨勬満浼氾紝甯屾湜鎴戣繖綃囨枃绔犲彲浠ヨ搗鍒頒竴浜涙姏鐮栧紩鐜夌殑浣滅敤錛屽茍嬈㈣繋澶у瀵瑰叾涓殑閿欒榪涜鎸囨錛屾榪庡彂琛ㄦ剰瑙侊紝榪涜浜ゆ祦銆?/span> 鍘熸枃鍙傜収銆?/span>Analysis Patterns錛?/span>Reusable Object Models銆嬶紝Chapter 2錛?/span>Martin Fowler1.1 Party妯″紡
1.2 緇勭粐錛?/span>Organization錛夌殑鍐呴儴緇撴瀯
1.3 緇勭粐鍏崇郴鎶借薄
1.4 璐d換錛圓ccountability錛夋ā寮?/span>
1.5 鐭ヨ瘑灞傦紙Knowledge level錛夊拰鎿嶄綔灞傦紙Operational level錛夊垎紱?
1.6 灝忕粨
鍘熸枃錛?a >http://blog.csdn.net/nzh_csdn/archive/2004/12/19/221484.aspx
]]>
鎷夛細涔熷氨鏄瀵熻呮潵鍐沖畾鎺ュ埌“鍙瀵熻?#8221;綾婚氱煡鏃惰幏鍙?#8220;鍙瀵熻?#8221;鐨勫摢浜涘彉鍖栥傝皟鐢ㄦ柟娉昻otifyObservers錛堬級錛?br />
鎺細“鍙瀵熻?#8221;綾婚氱煡瑙傚療鑰呮椂浼犻掔粰瑙傚療鑰呰嚜韜墍鏈夌殑鍙樺寲銆傝皟鐢ㄦ柟娉昻otifyObservers錛圤bject arg錛夛紱
import java.util.Observable;
import java.util.Observer;
//姝ょ被瀹炵幇鐨勬槸“鎷?#8221;鐨勫彂寮忥紝緇ф壙java.util.Observable綾?br />
public class WeatherData extends Observable {
private float temperature;
private float humidity;
private float pressure;
//鏋勯犲櫒涓嶉渶瑕佷負浜嗚浣忚瀵熻呬滑鑰屽緩绔嬫暟鎹粨鏋勪簡
public WeatherData() { }
public void measurementsChanged() {
setChanged();//鎸囩ず鍙瀵熻呯姸鎬佸凡鏀瑰彉錛堝彲浠ョ敱鐘舵佹槸鍚︽敼鍙樺喅瀹氭槸鍚﹂氱煡瑙傚療鑰咃紝寰堝鏄擄紝鑷繁瀹炵幇灝辮錛?br />
notifyObservers();//娌℃湁璋冪敤浼犻佹暟鎹璞★紝琛ㄧず閲囩敤“鎷?#8221;鐨勫仛娉?br />
}
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
//浠ヤ笅涓嶆槸鏂版柟娉曪紝鑰屾槸涓轟簡浣跨敤“鎷?#8221;鐨勫仛娉?br />
public float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
}
import java.util.Observable;
import java.util.Observer;
//瀹炵幇java.util.Observer鎺ュ彛錛屾垚涓鴻瀵熻?br />
public class CurrentConditionsDisplay implements Observer, DisplayElement {
Observable observable;
private float temperature;
private float humidity;
//鏋勯犲櫒闇瑕丱bservable 浣滀負鍙傛暟錛屽茍灝嗘湰瀵硅薄鐧昏涓鴻瀵熻?br />
public CurrentConditionsDisplay(Observable observable) {
this.observable = observable;
observable.addObserver(this);
}
//鏀瑰彉update()鏂規硶錛屽鍔燨bservable 鍜屾暟鎹璞′負鍙傛暟
public void update(Observable obs, Object arg) {
if (obs instanceof WeatherData) {
WeatherData weatherData = (WeatherData)obs;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
display();
}
}
public void display() {
System.out.println("Current conditions: " + temperature
+ "F degrees and " + humidity + "% humidity");
}
}
娉ㄦ剰錛歫ava.util.Observable鏄竴涓被鑰屼笉鏄帴鍙o紝鑰屼笖榪樻病鏈夊疄鐜頒換浣曟帴鍙c傚畠鏈韓鐨勫疄鐜版湁寰堝闂錛岄檺鍒朵簡瀹冪殑浣跨敤鍜屽鐢ㄣ傜敱浜庡畠鏄釜綾伙紝鎵浠ユ垜浠彧鑳界戶鎵匡紝java涓嶅厑璁稿緇ф壙錛屾墍浠ラ檺鍒朵簡鍏跺鐢ㄦ綔鍔涖傝屼笖setChanged()鏂規硶琚繚鎶よ搗鏉ワ紙琚畾涔夋垚protected錛夛紝榪欏氨鎰忓懗鐫闄ら潪緇ф壙錛屽惁鍒欐棤娉曞垱寤哄疄渚嬪茍緇勫悎鍒拌嚜宸辯殑瀵硅薄涓紝榪欏氨榪濊儗浜嗚璁″師鍒?#8220;澶氱敤緇勫悎錛屽皯鐢ㄧ戶鎵?#8221;銆?/span>
]]>
瑙傚療鑰呮ā寮忥細鍦ㄥ璞′箣闂村畾涔変竴瀵瑰鐨勪緷璧栵紝褰撲竴涓璞℃敼鍙樼姸鎬侊紝渚濊禆浠栫殑瀵硅薄閮戒細鏀跺埌閫氱煡錛屽茍鑷姩鏇存柊銆傦紙浠ユ澗鑰﹀悎鏂瑰紡鍦ㄤ竴緋誨垪瀵硅薄涔嬮棿娌熼氱姸鎬侊紝浠h〃浜虹墿--MVC錛?br />
娉ㄦ剰浜嬮」錛氫富棰橈紙鍙瀵熻咃級鐢ㄤ竴涓叡鍚岀殑鎺ュ彛鏉ユ洿鏂拌瀵熻咃紝涓婚涓嶇煡閬撹瀵熻呯殑緇嗚妭錛屽彧鐭ラ亾瑙傚療鑰呭疄鐜頒簡瑙傚療鑰呮帴鍙c備嬌鐢ㄦ妯″紡鏃訛紝浣犲彲浠庤瑙傚療鑰呭鎺紙push錛夋垨鎷夛紙pull錛夋暟鎹紙鎺ㄧ殑鏂瑰紡琚涓烘洿姝g‘錛夈傛湁澶氫釜瑙傚療鑰呮椂錛屼笉鍙互渚濊禆鐗瑰畾鐨勯氱煡欏哄簭銆俲ava鏈夊縐嶈瀵熻呮ā寮忕殑瀹炵幇錛屽寘鎷琷ava.util.Observable(鏈変竴浜涜繚鑳岃璁″師鍒欑殑闂錛屾湁蹇呰鐨勮瘽鍙互瀹炵幇鑷繁鐨凮bservable)錛孞avaBeans,RMI絳夛紝Swing澶ч噺浣跨敤姝ゆā寮忥紝璁稿GUI妗嗘灦涔熸槸濡傛銆?br />
public class ForecastDisplay implements Observer, DisplayElement {
private float currentPressure = 29.92f;
private float lastPressure;
private WeatherData weatherData;
public ForecastDisplay(WeatherData weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
public void update(float temp, float humidity, float pressure) {
lastPressure = currentPressure;
currentPressure = pressure;
display();
}
public void display() {
System.out.print("Forecast: ");
if (currentPressure > lastPressure) {
System.out.println("Improving weather on the way!");
} else if (currentPressure == lastPressure) {
System.out.println("More of the same");
} else if (currentPressure < lastPressure) {
System.out.println("Watch out for cooler, rainy weather");
}
}
}
public class StatisticsDisplay implements Observer, DisplayElement {
private float maxTemp = 0.0f;
private float minTemp = 200;
private float tempSum= 0.0f;
private int numReadings;
private WeatherData weatherData;
public StatisticsDisplay(WeatherData weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
public void update(float temp, float humidity, float pressure) {
tempSum += temp;
numReadings++;
if (temp > maxTemp) {
maxTemp = temp;
}
if (temp < minTemp) {
minTemp = temp;
}
display();
}
public void display() {
System.out.println("Avg/Max/Min temperature = " + (tempSum / numReadings)
+ "/" + maxTemp + "/" + minTemp);
}
}
public class WeatherStation {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentDisplay =
new CurrentConditionsDisplay(weatherData);
StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);
ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);
weatherData.setMeasurements(80, 65, 30.4f);
weatherData.setMeasurements(82, 70, 29.2f);
weatherData.setMeasurements(78, 90, 29.2f);
}
}
褰撴垜浠兂娣誨姞涓涓竷鍛婃澘鐨勬椂鍊欏彧瑕佸疄鐜拌瀵熻呭熷彛灝卞彲浠ュ姞鍏ヤ富棰橀氱煡鐨勮褰曚腑錛屽疄闄呬唬鐮佸涓嬶細
//鎴戜滑瑕佹坊鍔犱竴涓叿鐑寚鏁扮殑甯冨憡鏉匡紝鍒╃敤涓濂楀叕寮忔潵璁$畻閰風儹鎸囨暟銆?br />
public class HeatIndexDisplay implements Observer, DisplayElement {
float heatIndex = 0.0f;
private WeatherData weatherData;
public HeatIndexDisplay(WeatherData weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
public void update(float t, float rh, float pressure) {
heatIndex = computeHeatIndex(t, rh);
display();
}
//閰風儹鎸囨暟璁$畻
private float computeHeatIndex(float t, float rh) {
float index = (float)((16.923 + (0.185212 * t) + (5.37941 * rh) - (0.100254 * t * rh)
+ (0.00941695 * (t * t)) + (0.00728898 * (rh * rh))
+ (0.000345372 * (t * t * rh)) - (0.000814971 * (t * rh * rh)) +
(0.0000102102 * (t * t * rh * rh)) - (0.000038646 * (t * t * t)) + (0.0000291583 *
(rh * rh * rh)) + (0.00000142721 * (t * t * t * rh)) +
(0.000000197483 * (t * rh * rh * rh)) - (0.0000000218429 * (t * t * t * rh * rh)) +
0.000000000843296 * (t * t * rh * rh * rh)) -
(0.0000000000481975 * (t * t * t * rh * rh * rh)));
return index;
}
public void display() {
System.out.println("Heat index is " + heatIndex);
}
}
//鍔犲叆閰風儹鎸囨暟甯冨憡鏉垮悗鐨勬祴璇曠被
public class WeatherStationHeatIndex {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);
StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);
ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);
HeatIndexDisplay heatIndexDisplay = new HeatIndexDisplay(weatherData);
weatherData.setMeasurements(80, 65, 30.4f);
weatherData.setMeasurements(82, 70, 29.2f);
weatherData.setMeasurements(78, 90, 29.2f);
}
}
public class MiniDuckSimulator {
public static void main(String[] args) {
DecoyDuck decoy = new DecoyDuck();
decoy.performQuack();
decoy .performFly();
//榪愯鏃舵妸椋炶鐘舵佹敼涓虹伀綆姪鎺ㄥ櫒椋炶
decoy .setFlyBehavior(new FlyRocketPowered());
decoy .performFly();
}
}