There are objects, many named after the nouns in the domain space, and these objects are connected with the rich relationships and structure that true domain models have. The catch comes when you look at the behavior, and you realize that there is very little behavior on these objects. Indeed often these models come with design rules that say that you are not to put any domain logic in the the domain objects. Instead there are a set of service objects which capture all the domain logic. These services live on top of the domain model and use the domain model for data.
涔熷氨鏄鍦ㄩ鍩熸ā鍨嬩腑錛屾湰韜彧澶勭悊寰堝皯鐨勮涓洪昏緫錛屽ぇ澶氭暟閮芥槸澶勫湪妯″瀷涓婂眰鐨勪竴緋誨垪鐨凷ervice綾繪潵璐熻矗鎹曡幏澶勭悊榪欎簺棰嗗煙閫昏緫琛屼負銆傝繖榪濊儗浜哋O鎬濇兂錛圤O璁や負搴旇鎶婃暟鎹拰琛屼負鍚堝湪涓璧鳳級銆?/p>
Eric Evans鍦ㄤ粬鐨凞omain Driven Design涓榪囷細
Application Layer [his name for Service Layer]: Defines the jobs the software is supposed to do and directs the expressive domain objects to work out problems. The tasks this layer is responsible for are meaningful to the business or necessary for interaction with the application layers of other systems. This layer is kept thin. It does not contain business rules or knowledge, but only coordinates tasks and delegates work to collaborations of domain objects in the next layer down. It does not have state reflecting the business situation, but it can have state that reflects the progress of a task for the user or the program.
Domain Layer (or Model Layer): Responsible for representing concepts of the business, information about the business situation, and business rules. State that reflects the business situation is controlled and used here, even though the technical details of storing it are delegated to the infrastructure. This layer is the heart of business software.
鎹鍦═houghtwork鍏徃閲岄潰閲囩敤鐨勬妧鏈槸Hibernate+Spring+webwork錛屽叧浜巃nemia domain model鏈変笉灝戝憳宸ュ湪鍏徃鍐呴儴閭歡涓彂闂侀┈搴旇浠涔堟紜嬌鐢ㄣ備絾鏄侀┈榪樻病鏈夌粰鍑虹‘鍒囩瓟妗堬紝鍙斁鍏ODOList鍘匯?br /> 鎴戜釜浜鴻鐨凞omail綾諱腑涓嶅簲璇ュ惈鏈夎繃澶氱殑涓庝箣鏃犲叧鐨勮涓猴紝涓嶄絾榪濆弽浜嗗崟涓鑱岃矗鐨勫師鍒欙紝榪樹嬌寰楁暣涓郴緇熶笉澶熺ǔ瀹氥備緥濡俇ser涓湁Roles錛岄偅涔坅ddRole,removeRole鑷劧搴斿湪Domain綾籙ser涓啓錛岃嚦浜巖emoveUser,loadUser絳夊簲璇ュ皝瑁呮垚Dao鍘誨鐞嗐?/p>
寮曠敤robbin鍦ㄤ竴嬈¤璁轟腑鐨勫洖澶嶏細
鎴戠殑鐞嗚В鏄疢artin澶у彅鎵璋撶殑domain object鏄?#8220;棰嗗煙妯″瀷”錛屽畠鏄竴涓拡瀵逛笟鍔¢昏緫鎶借薄鐨勬ā鍨嬶紝鍜岃蔣浠剁紪紼嬫牴鏈鏃犲叧緋匯傚嵆浣夸綘涓嶅紑鍙戣繖涓蔣浠訛紝浣犱粛鐒墮渶瑕佹娊璞′綘鐨勪笟鍔¢昏緫寰楀埌浣犵殑棰嗗煙妯″瀷銆傝繖涓鍩熸寚鐨勬槸浣犳墍浠庝簨鐨勮涓氾紝鑰屼笉鏄嫮闅樼殑鎸佷箙鍖栫被銆?
騫朵笖棰嗗煙妯″瀷鐨勫緩妯′篃鏄湪闇姹傚垎鏋愰樁孌碉紝鎴栬呭湪闇姹傚垎鏋愰樁孌典箣鍓嶅畬鎴愮殑浜嬫儏銆傚叿浣撳埌緙栫▼鐨勮繃紼嬩腑錛岄鍩熸ā鍨嬪茍闈炲搴旀煇涓涓狫ava綾伙紝濡傛灉涓瀹氳寮鴻瀵瑰簲鐨勮瘽錛岋紙涓氬姟瀵硅薄錛孌ao鎺ュ彛錛孒ibernate瀹炰綋綾伙級浠栦滑鍚堣搗鏉ョ粺縐伴鍩熸ā鍨嬪湪Java璇█鐨勫疄鐜般傛妸 鍟嗕笟寤烘ā鑼冪暣鐨?#8220;棰嗗煙妯″瀷”鎷挎潵褰撳仛Hibernate緙栫▼涓殑瀹炰綋綾伙紝鏍規湰灝辨槸鐗涘ご涓嶅椹槾!
鍏跺疄浣犵殑涓誨紶灝辨槸鎶婃寔涔呭寲瀹炰綋綾葷殑鎸佷箙鍖栨搷浣滈檮鐫鍒板疄浣撶被涓婇潰鍘伙紝鑰屼笉鏄垎寮銆備婦渚嬫潵璇達紝涔熷氨鏄Account綾葷殑澧炲垹鏀規煡涓嶅簲璇ュ崟鐙垎紱誨埌AccountDao鎺ュ彛鍘伙紝鑰屽簲璇ユ妸澧炲垹鏀規煡鎿嶄綔鏀懼湪Account綾婚噷闈㈡潵瀹屾垚錛屽涓嶏紵
閭d箞鎴戝湪瑙i噴榪欎釜闂涔嬪墠錛屽繀欏繪緞娓呬竴鐐癸紝灝辨槸榪欎釜闂鐨勮璁猴紝鍗蟲寔涔呭寲鎿嶄綔鏄惁搴旇鍗曠嫭鎶借薄涓涓狣AO灞傜殑闂鏄拰Martin Fowler鎻愬埌浜嗚傳琛鐨勯鍩熸ā鍨嬫鏃犲叧緋葷殑銆傚疄闄呬笂浼犵粺鐨凟ntity Bean灝辨槸榪欑鎶婃寔涔呭寲鎿嶄綔闄勭潃鍒癊ntity Bean鏈韓鍘葷殑錛屼絾鏄疢artin Fowler涓鏍峰湪璇達紝榪欑Entity Bean灝辨槸璐鐨勩?
濂戒簡錛屾垜浠幇鍦ㄦ妸鍏朵粬鏃犲叧鍥犵礌鎺掗櫎浜嗭紝focus鍒拌繖涓瘽棰樹笂錛屽氨鏄垜浠槸鍚﹂渶瑕丏AO鎺ュ彛鐨勯棶棰樹簡銆傚洜涓烘寜鐓т綘鐨勮鐐癸紝濡傛灉鎶婂璞$殑澧炲垹鏀規煡閮芥斁鍦ㄥ疄浣撶被涓婇潰錛屽叾瀹炴垜浠氨涓嶉渶瑕丏AO鎺ュ彛灞備簡錛屼笟鍔″璞″拰Web Action閮藉彲浠ョ洿鎺ヨ皟鐢ㄥ疄浣撶被鏈韓鏉ュ畬鎴愭寔涔呭寲鎿嶄綔浜嗐?
澶ф鍦?003騫翠互鍓嶏紝鎴戜竴鐩村氨鏄噰鐢ㄨ繖縐嶆ā鍨嬬殑錛屼絾鏄粠2003騫村紑濮嬶紝鎴戝氨鏀規垚浜嗗垎紱諱竴涓狣AO灞傛潵涓撻棬澶勭悊鎸佷箙鍖栨搷浣滀簡銆傚師鍥犳槸澶氭柟闈㈢殑錛屼粠鎶鏈搴︽潵鑰冮噺鐨勮瘽錛屽垎紱誨氨鏈夊緢澶氬ソ澶勶紝Rod Johnson鍦ㄣ妛ithout EJB銆嬬10绔犳寔涔呭寲閲岄潰灝辮緇嗛槓榪頒簡闇瑕丏AO灞傜殑鐞嗙敱錛屾垜寤鴻浣犵湅涓涓嬶紝榪欓噷涓嶅榪頒簡銆傚彧璋堜竴涓嬮櫎浜哛od Johson鎻愬埌鐞嗙敱涔嬪鐨勭悊鐢憋細
浣滀負淇濇寔鐘舵佺殑瀹炰綋綾伙紝浠栫殑鑱岃矗鏄繚鎸佺姸鎬侊紝鑰屼笉璐熻矗鐘舵佺殑鎸佷箙鍖栥傚鏋滄妸鎸佷箙鍖栨搷浣滀篃鏀懼湪瀹炰綋綾諱腑錛屼竴鏂歸潰鏉ヨ錛屾妸涓ょ涓嶅悓鐨勮亴璐f斁鍦ㄤ竴涓被涓紝騫朵笉絎﹀悎OCP鐨勫崟涓鑱岃矗鐨勫師鍒欙紝鐒惰屾洿閲嶈鐨勫師鍥犳槸浼氬甫鏉ュ疄浣撶被鐨勪笉紼沖畾鐨勯棶棰樸?
鍦ㄦ垜鐨勭悊蹇典腑錛屽疄浣撶被浠ュ強瀹炰綋綾誨叧鑱斿叧緋繪槸涓涓蔣浠剁郴緇熶腑鏈紼沖畾涓嶅彉鐨勯儴鍒嗭紝鍦ㄦ暣涓蔣浠剁郴緇熶腑錛屽悇涓眰闈㈤兘闇瑕佹秹鍙婂埌瀹炰綋綾葷殑鎿嶄綔錛屽浣曞垝鍒嗗疄浣撶被錛屼互鍙婄‘瀹氬疄浣撶被鍏寵仈鏄渶璐硅冮噺鐨勶紝紜畾浜嗚繖涓鐐癸紝鏁翠釜杞歡緋葷粺灝卞簳灞備緷璧栧叧緋誨氨琚‘瀹氫笅鏉ヤ簡錛堝疄浣撶被鐨勫睘鎬у彲浠ュ彉鍖栵紝鐢變簬杞歡緋葷粺瀵瑰疄浣撶殑鎿嶄綔閮芥槸浠ュ疄浣撶被涓哄崟浣嶇殑錛屾墍浠ュ疄浣撳睘鎬х殑鍙樺寲涓嶄細閫犳垚緋葷粺涓嶇ǔ瀹氾級錛屼笂闈㈢殑DAO灞傦紝涓氬姟灞傦紝Web灞傞兘鍙瀹炰綋綾諱駭鐢熷崟鍚戜緷璧栥?
濡傛灉浣犳妸DAO灞傚悎騫跺埌瀹炰綋綾諱腑錛岃娉ㄦ剰鏈潵Web灞傛槸涓嶄緷璧栦簬DAO灞傜殑錛學eb灞傚彧渚濊禆瀹炰綋綾伙紙鍥犱負瀹冭灞曠幇瀹炰綋綾葷姸鎬侊級錛屼絾鏄敱浜庝綘鍚堝茍浜嗭紝浣垮緱Web灞備篃鍙樺緱渚濊禆閭d簺DAO灞傜殑鎿嶄綔浜嗐傝繖鏍風殑緇撴灉灝辨槸璁╄蔣浠剁郴緇熺殑鑰﹀悎鎬ф彁楂橈紝鍙幾緙╂ч檷浣庯紝鍙淮鎶ゆч檷浣庛?
DAO灞傜殑鍙樺姩鏄ぇ浜庡疄浣撶被鍙樺姩鐨勶紝瀹炰綋綾誨熀鏈笂紼沖畾涓嶅彉錛岃岃蔣浠剁郴緇熺殑闇姹傚彉鏇村嚑涔庝竴瀹氫細甯︽潵DAO灞傜殑鍙樺姩錛屼絾鏄茍涓嶄細甯︽潵瀹炰綋綾誨眰鐨勫彉鍔紙浼氬甫鏉ュ疄浣撳睘鎬х殑鍙樺姩錛屼絾鏄緢灝戜細褰卞搷鍒板疄浣撶被鏈韓錛夈傛墍浠AO灞傜殑鍙樺姩棰戠巼榪滆繙澶т簬瀹炰綋綾匯傞偅涔堝綋浣犳妸DAO灞傛搷浣滃悎騫跺埌瀹炰綋綾諱互鍚庯紝鍏剁粨鏋滃氨鏄瀹炰綋綾葷殑鍙樺姩棰戠巼絳変簬DAO灞傜殑鍙樺姩棰戠巼銆傞偅涔堝氨浼氶犳垚鏈潵紼沖畾鐨勫疄浣撶被灞傚彉寰楀彉寰楅鐜囬珮浜嗗緢澶氾紝鑰屽疄浣撶被鐨勫彉鍔ㄤ細娉㈠強鍒拌蔣浠剁郴緇熺殑姣忎釜灞傞潰錛岄犳垚杞歡澶ч潰縐殑鐩稿叧鎬у拰涓嶇ǔ瀹氥?
璇瘋浣忓緢閲嶈鐨勪竴鐐癸細瀹炰綋綾繪槸鏈夌姸鎬佺殑綾伙紝DAO綾繪槸鏃犵姸鎬佺殑綾伙紝鍦ㄦ暣涓蔣浠剁郴緇熶腑錛屽彧鏈変袱縐嶇被鏈夌姸鎬侊紝涓涓槸瀹炰綋綾伙紝涓涓槸HTTP Session銆傛湁鐘舵佺殑綾諱細甯︽潵寰堥珮鐨勪唬鐮佺浉鍏蟲э紝搴旇灝介噺鍑忓皯鏈夌姸鎬佺被鐨勫獎鍝嶈寖鍥達紝灝介噺鍑忓皯鏈夌姸鎬佺被鐨勫彉鍔ㄩ鐜囷紝搴旇灝介噺鍑忓皯鏈夌姸鎬佺被鐨勮亴璐c?
鑰屼綘鎶奃AO鎿嶄綔鍚堝茍鍒板疄浣撶被浠ュ悗錛岀粨鏋滃氨鏄墿澶т簡鏈夌姸鎬佺被鐨勪唬鐮佺浉鍏蟲х殑鑼冨洿鍜屽獎鍝嶈寖鍥達紝鎵╁ぇ浜嗘湁鐘舵佺被鐨勫彉鍔ㄩ鐜囷紝鏈鍚庡氨閫犳垚杞歡緋葷粺鐨勭ǔ瀹氭т笅闄嶃?br />
public final class ArrayUtil {
private ArrayUtil(){
}
/**
* Code shared by RegressionLine and WeightedAverage to discard prefix-zeros of array.
* if all the elems of array are zero, return null.
*/
public static double[] discardPrefixZero(double[] data){
int firstNoZeroIndex = -1;
for(int i=0;i<data.length;i++) {
if(data[i] == 0d) {
continue;
}
else{
firstNoZeroIndex = i;
break;
}
}
if(firstNoZeroIndex == -1)
return null;
double[] data2 = new double[data.length-firstNoZeroIndex];
System.arraycopy(data, firstNoZeroIndex, data2, 0, data.length-firstNoZeroIndex);
return data2;
}