锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 铏界劧榪樻槸灝忚彍楦燂紝浣嗘棦鐒剁湅榪囦簡璁捐妯″紡錛岃繕鏄笇鏈涜兘鐢ㄨ搗鏉ョ殑銆?/p>
鎯沖仛涓嚜濞辮嚜涔愮殑j2ee鐨勪笢瑗褲?/p>
鍏充簬寰楀埌鏁版嵁搴撹繛鎺ラ儴鍒嗭紝涓寮濮嬭寰楁槸鐢ㄥ伐鍘傛ā寮忥紝鐢ㄥ伐鍘傛ā寮忓緱鍒癈onnection瀵硅薄錛岃瘯浜嗗嚑嬈″ソ鍍忎笉琛屻?/p>
鐒跺悗灝濊瘯鍗曟佹ā寮忥紝鍒涢犱簡涓涓狣atabaseGeneralServices綾伙紝鏉ユ彁渚涙暟鎹簱榪炴帴鍜屽叧闂暟鎹簱絳変竴浜涢氱敤鐨勬湇鍔°?br />
涓鍒囨甯搞傛湁鐐瑰皬鎰熸偀錛屼唬鐮佸涓嬶紝甯屾湜楂樻墜鎸囩偣銆?/p>
package com.ClockWise.ray.persistence; import java.sql.Connection; import javax.naming.InitialContext; public class DatabaseGeneralServices { }
綺楃矖鐪嬪畬涓閬嶈璁℃ā寮忕殑鏃跺欙紝瑙夊緱Builder Pattern鍜孎actory Method Pattern鏈夌偣娣鋒穯錛屽ソ鍍忚繖涓よ呴兘鏄皢澶嶆潅鐨勬瀯閫犺繃紼嬪睆钄芥帀錛屾渶緇堣繑鍥炰竴涓狢lient婊℃剰鐨勫璞★紝浣嗕粬浠殑鏈川鏄笉涓鏍風殑銆?br />
Builder Pattern鍙拡瀵逛竴涓被錛岃繖涓被鐨勭壒鐐規槸鏋勯犺搗鏉ヨ繃紼嬬壒鍒鏉傦紝鎵浠ュ皢鏋勯犵殑閮ㄥ垎鐙珛鍑烘潵錛屼笓闂ㄧ敤涓涓狟uilderClass鏉ヨ礋璐g敓鎴愬璞°?br />
Factory Method鏇村鐨勬槸閽堝鐢熸垚瀹炵幇鍚屼竴鎺ュ彛鐨勪竴緇勭被涓殑鏌愪釜銆傛湁鐐規嫍鍙o紝灝辨槸鍦ㄨ繍琛屾椂鐢熸垚姝g‘鐨勫璞°?br />
鎬葷粨涓嬫潵錛屽氨鏄疊uilder閽堝涓涓狢lass錛孎actory Method閽堝浠庝竴緇凜lass涓寫閫変竴涓?/span>銆?/span>
]]>
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.NamingException;
import javax.sql.DataSource;
private DataSource ds;
private InitialContext ic;
private static DatabaseGeneralServices dgs = new DatabaseGeneralServices();
private DatabaseGeneralServices()//use singleton pattern, so the constructor is private
{
try{
ic = new InitialContext ();
ds = (DataSource)ic.lookup("java:jdbc/readshare");//get database connection
}catch(NamingException e){
e.printStackTrace();
}
}
public Connection getConnection(){
try{
return ds.getConnection();
}catch(SQLException e){
e.printStackTrace();
}
return null;
}
public void closeConnection(ResultSet rs,PreparedStatement ps,Connection conn){
try{
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLException e ){
e.printStackTrace();
}
}
public static DatabaseGeneralServices getInstance()//get the sigleton instance
{
if(null==dgs){dgs= new DatabaseGeneralServices();}
return dgs;
}
]]>
浠庤繖涓ā寮忕殑鍚嶅瓧灝卞彲浠ョ煡閬撲釜澶ф錛?/span>Template璇存槑榪欎釜妯″紡鏈変竴涓ā鐗堬紝瀛愮被閮借鎸夌収鐖剁被鍒楀嚭鐨勫ぇ綰叉潵騫叉椿銆傚湪榪欎釜妯″紡涓紝鐖剁被閫氬父鏄?/span>abstract鐨勩備負浠涔堜笉鐢ㄦ帴鍙o紵鍥犱負瀵規煇浜涙墍鏈夊瓙綾婚兘瑕佺敤鍒扮殑鏂規硶錛岀埗綾諱腑灝辯粰鍑轟簡浠g爜錛岃屾帴鍙d腑鏄笉鑳芥湁鍏蜂綋瀹炵幇浠g爜鐨勩?/span>
鐖剁被涓湁涓涓葷殑鏂規硶灝辨槸鎵璋撶殑template method錛岃繖涓柟娉曢氬父琚0鏄庝負final錛岃繖鏍峰瓙綾誨氨鏃犳硶override瀹冿紝淇濊瘉浜嗗畠鐨勬潈濞佹с傝繖涓?/span>template method璋冪敤鍏跺畠鏂規硶錛岃繖浜?#8220;鍏跺畠鏂規硶”鍖呮嫭浜嗕笁涓被鍨嬶細
絎竴縐嶏紝鏄?/span>abstract綾誨瀷錛屽瓙綾婚渶瑕佹牴鎹嚜宸辯殑鎯呭喌瀹炵幇榪欓儴鍒嗕唬鐮侊紱
絎簩縐嶏紝鏄?/span>final鍨嬬殑錛岃繖縐嶆柟娉曠埗綾繪妸瀹冨啓姝諱簡錛屽瓙綾誨繀欏婚伒瀹堬紱
絎笁縐嶏紝灝辨槸鏅氭柟娉曪紝鏄?/span>optional鐨?/span>錛屽瓙綾誨彲浠ュ歡鐢ㄧ埗綾葷殑鏂規硶錛屼篃鍙互override鎺夊畠錛屽啓鑷繁鐨勪唬鐮侊紝榪欑optional鐨勬柟娉曠粰瀹冧竴涓悕瀛楀彨鍋?/span>hook銆?/span>
榪欎釜鐖剁被閫氬父鏄繖縐嶅艦鍔褲?/span>
abstract class AbstractClass{
final void templateMethod(){
a();
b();
c();
…
}
abstract void a();
final void b(){}
void c(){}
}
搴旇璇磋繖涓ā寮忔棦钑村惈鐫鏉冨▉鎬у拰鑷敱鎬с?/span>
Iterator and Composite Patterns
榪欎釜妯″紡鐨勭爺絀跺璞℃槸Collection錛屽寘鎷?/span>ArrayList銆?/span>Array鐢氳嚦榪樻湁Hashmap絳夌瓑涓鍒?/span>java閲岄潰鐨勯泦鍚堝璞°?/span>Iterator鐨勭悊蹇墊槸鎶婇泦鍚堝璞′腑鐨勯亶鍘嗙瓑鍔熻兘鐙珛鎶藉彇鍑烘潵錛屽疄鐜頒竴涓?/span>Iterator鐨勬帴鍙o紝涓昏瀹炵幇next錛堬級鍜?/span>hasNext錛堬級涓や釜鏂規硶錛岃繖浜涗笢瑗垮拰鏁版嵁緇撴瀯閲岄潰鐨勪笢瑗垮熀鏈竴鏍楓?/span>
鑰屼互姝や負鍩虹鐨?/span>Composite Pattern鍏跺疄灝辨槸鏁版嵁緇撴瀯閲岄潰鏍戠殑姒傚康錛屾墍浠ヨ繖閲岀殑涓滆タ榪樻槸鎵炬湰鏁版嵁緇撴瀯涔︾湅鐪嬫洿濂姐?/span>
The State Pattern
鍒濈湅榪欎釜妯″紡錛屽彂鐜伴噷闈㈡湁涓涓被浼?/span>UML涓姸鎬佸浘鐨勪笢瑗匡紝濡傚叾鍚嶅瓧錛岃繖涓ā寮忎富瑕佹弿榪板浣曞鐞嗗簲鐢ㄤ腑鍑虹幇鐨?#8220;鐘舵?#8221;銆?/span>
瑙e喅鏂瑰紡鏄繖鏍風殑錛?/span>
. 絎竴姝ワ紝鍒涘緩涓涓彨鍋?/span>State鐨勬帴鍙?/span>錛岄噷闈㈠寘鍚粈涔堜笢瑗垮憿錛熻寰?/span>UML鐘舵佸浘涓彂鐢熺姸鎬佽漿鎹㈡椂綆ご涓婇潰閭d簺鏀瑰彉鐨勬潯浠訛紵鎶婅繖浜涙潯浠跺叏閮ㄨ漿鍖栦負鏂規硶錛岃〃紺哄綋榪欎釜鏉′歡鍙戠敓鏃訛紝鐘舵佽鎬庝箞鍙樸?/span>
絎簩姝ワ紝姣忎釜鍏蜂綋鐨?/span>concreteState閮借瀹炵幇閮借瀹炵幇State榪欎釜鎺ュ彛銆傛庝箞瀹炵幇錛熷綋鐒訛紝state涓嶆槸鐙珛鍑虹幇鐨勶紝鎬繪湁涓涓妸瀹冧綔涓哄弬鏁扮殑綾伙紝閲岄潰鏈変釜縐佹湁鍙橀噺淇濆瓨褰撳墠鐨勭姸鎬侊紝鏆備笖灝辨妸瀹冪О浣?/span>currentState鍚с傛帴鍙d腑瀹氫箟鐨勬柟娉曪紝鍦?/span>concreteState涓繖鏍峰疄鐜幫細姣忎釜鏂規硶鏍規嵁鏉′歡瀹氫箟錛屽皢currentState鏀規垚鐩稿簲鐨勭姸鎬併?/span>
浠ヤ笂鍏跺疄灝辨槸State Pattern鐨勭簿楂撱?/span>
Singleton Pattern
閽堝涓浜涘湪搴旂敤涓彧浼氭湁涓涓璞″瓨鍦ㄧ殑綾昏屾葷粨鐨勬ā寮忋?/span>
浠や漢鎰忔兂涓嶅埌鐨勬槸錛屽畠鏄氳繃澹版槑璇ョ被鐨勬瀯閫犲嚱鏁頒負縐佹湁榪欑鏂規硶鏉ュ疄鐜扮殑銆?/span>
鐤戦棶灝辨槸錛屾棦鐒舵瀯閫犲嚱鏁伴兘鎴愮鏈変簡錛岄偅鎬庝箞鏉ュ垱寤鴻繖涓被鐨勫璞″憿錛?/span>
瑙g瓟灝辨槸閫氳繃鍦ㄧ被涓0鏄庝竴涓潤鎬佹柟娉曪紝榪斿洖榪欎釜瀵硅薄銆?/span>
鍏稿瀷鐨勫啓娉曟槸
public static Singleton getInstance(){
if(uniqueInstance==null){uniqueInstance = new Singleton();}
return uniqueInstance;
}
榪欎釜妯″紡鐨勭簿楂撳氨榪欎箞綆鍗曪紝鍓╀笅鐨勫氨鏄嚎紼嬪瀵硅薄鐨勬搷浣滃畨鍏紝瑕佹妸榪欎釜鏂規硶鍔犱笂synchronized鍏抽敭瀛椼?/span>
Command Pattern
涔︿腑鏄互槨愰鐐硅彍浣滄瘮鏉ヨ榪拌繖涓ā寮忕殑銆?/span>
鍏朵腑鐨勫姣旀蹇靛涓?/span>
Customer-------Client
Order------------Command
Waitress--------Invoker
Cook------------Receiver
Take order--------setCommand
orderUp-----------excute
鎬庝箞鏉ヨВ閲婂憿錛熻鐧戒簡錛屽氨鏄妸璋冪敤綾昏杈炬垚鐨勬搷浣滃皝瑁呮垚涓涓?/span>Command瀵硅薄錛屽氨鍍忕偣鑿滈偅寮犲崟瀛愪竴鏍鳳紝褰撶劧榪欎釜Command瑕佺鍚堜竴瀹氱殑瑙勫垯瀹炵幇Command鎺ュ彛錛岄噷闈㈤潪甯擱噸瑕佺殑涓涓柟娉曞氨鏄?/span>execute銆?/span>
setCommand鏂規硶鐩稿綋浜?/span>waitress鎶婅彍鍗曢掔粰浜嗗帹甯堬紝鍦ㄦ帴鏀惰呮柟闈粬鍙榪愯execute錛屽叿浣撳仛浠涔堜紶榪囨潵鐨?/span>command瀵硅薄閮藉凡緇忚瀹氬ソ浜嗐?/span>
Adapter & Façade
閫傞厤鍣ㄦā寮忓叾瀹炴病浠涔堝璇寸殑錛屽氨鏄鎶婁紶榪囧幓鐨勫璞¤瀹炵幇鎺ユ敹鑰呮敮鎸佺殑鏍煎紡錛岄偅涓牸寮忓疄闄呬笂灝辨槸涓涓帴鍙c?/span>
鑰?/span>Façade妯″紡鏄竴縐嶈鐢熺墿錛屽畠鐨勭洰鐨勬槸璁╂搷浣滅畝鍗曞寲銆傚皢涓緋誨垪涓嶅悓瀵硅薄涓殑鎿嶄綔鏁村悎錛屾彁渚涚粰鍏跺畠綾昏皟鐢ㄦ帴鍙d功涓婄殑渚嬪瓙鏄搴獎闄紝瑕佺湅閮ㄧ數褰憋紝瑕佸紑榪欎釜鐢靛櫒錛屽紑閭d釜鐢靛櫒錛岄氳繃Façade妯″紡錛屽皢瑕佺湅鐢靛獎鎵蹇呴』鐨勫姩浣滄暣鍚堣搗鏉ワ紝涓閿悶瀹氥傛槑鐧戒簡榪欑偣錛屼篃灝辯悊瑙d簡榪欎釜妯″紡銆?/span>
Factory Pattern
涔︿腑涓句簡鍖硅惃搴楃殑渚嬪瓙錛屼竴寮濮嬬殑綾伙紝灝嗗埗浣滀笉鍚岀被鍨嬪尮钀ㄧ殑鏂規硶閮藉寘鍚湪閲岄潰錛屾暣涓被鏄懼緱寰堝啑浣欍傞『鐫姝e父鐨勬濊礬錛屽皢鍒朵綔鍖硅惃鐨勬柟娉曚粠榪欎釜綾婚噷闈㈠墺紱誨嚭鍘誨崟鐙艦鎴愪竴涓被錛岃繖涓被灝卞儚鐢熶駭瀵硅薄鐨勫伐鍘傦紝鍙浣犲憡璇夊畠璇ョ敓浜х殑浜у搧鐨勫瀷鍙鳳紝瀹冨氨鐢熶駭瀵瑰簲鐨勫璞″啀鍙戦佺粰瀹㈡埛銆?/span>
鎸夌収涔︿腑鐨勪緥瀛愶紝濡傛灉鍖硅惃搴楀紑鍦ㄥ悓涓涓煄甯備互鍐咃紝鍖硅惃鐨勯鍛沖鏍鳳紝閭d箞涓婅堪鐨勬ā寮忓緢濂藉湴瀹炵幇浜嗕笂闈㈢殑鍔熻兘銆備絾濡傛灉鏄繛閿佸簵錛屾瘡涓湴鏂圭殑椋庡懗涓嶅悓鍛紵……
鏄殑錛屾瘡涓湴鏂圭殑椋庡懗涓嶅悓錛屼絾鍚屼竴涓湴鏂逛笉鍚屽尮钀ㄧ殑縐嶇被鍗寸浉褰撴湁闄愩備篃灝辨槸璇村彲浠ユ湁涓涓尮钀ㄥ簵鐖剁被錛岀劧鍚庡悇鍦扮殑鍒嗗簵鏄繖涓埗綾葷殑瀛愮被銆傝屽叾涓渶閲嶈鐨勫埗浣滃尮钀ㄧ殑鏂規硶鍦ㄧ埗綾諱腑琚0鏄庝負铏氬嚱鏁幫紝鐢卞悇涓叿浣撶殑瀛愮被鏉ュ疄鐜般傝繖鏍?#8220;宸ュ巶”鍙堣鎼洖鍏蜂綋鐨勭被涓棿銆?/span>
鍏蜂綋濡備綍浣跨敤錛屾垜涓漢瑙夊緱鏄鐪嬫儏鍐電殑銆備笂闈袱涓槸宸ュ巶妯″紡鐨勪袱縐嶈〃鐜板艦寮忋?/span>
瀵逛簬鍚庝竴縐嶆ā寮忥紝閲岄潰鐢ㄥ埌鐨勫璞★紝姣斿渚嬪瓙涓尮钀ㄧ殑鍘熸潗鏂欙紝鍚屾牱鍙互鐢ㄥ伐鍘傛ā寮忔潵瀹炵幇錛岃繖鏍風▼搴忕殑緇撴瀯灝辯浉褰撶伒媧諱簡銆?/span>
鍏朵腑鐨?#8220;涓”錛岀被浼間簬瀹氭姤綰哥郴緇熺殑鍙戦佹柟錛岃?#8220;澶?#8221;灝辨槸璁㈤槄鏂廣傚綋鏈夋柊鐨?#8220;鎶ョ焊”鏃訛紝鍙戦佹柟灝嗘渶鏂扮殑鎶ョ焊閫佽揪璁㈤槄鏂規墜涓傚彂閫佹柟緇存姢鐫涓涓闃呮柟鐨勫垪琛ㄣ?/span>
鏂囦腑閫氳繃涓涓皵璞$珯鐨勪緥瀛愭潵瑙h榪欎釜妯″紡銆?/span>WeatherData瀹炵幇Subject鎺ュ彛錛岄噷闈㈠寘鎷墍瑕佷紶閫佺殑private 鏁版嵁錛岃繕鏈夋敞鍐?/span>Observer鍜屽幓闄?/span>Observer鐨勬柟娉曘傚綋鏁版嵁鏈夋墍鏇存柊鏃惰皟鐢?/span>measurementChanged鏂規硶錛岃繖涓柟娉曞啀璋冪敤notifyObservers鏂規硶銆?/span>
鑰屽湪Observer閭g錛屾湁涓涓?/span>subject瀵硅薄鐨勭鏈夋暟鎹紝閫氳繃鏋勯犲嚱鏁板皢瑕佹敞鍐岀殑Subject浣滀負鍙傛暟鏉ュ瀹冭繘琛屽垵濮嬪寲錛屼互姝ゅ緩绔?/span>Observer鍜?/span>Subject鐨勮仈緋匯?/span>
鏈鍚庤繕浠嬬粛浜?/span>java閭e緩鐨?/span>Observer妯″紡銆傞氳繃緇ф壙Observable鏉ユ垚涓?/span>Subject錛岄氳繃瀹炵幇Observer鎺ュ彛鏉ユ垚涓?/span>Observer銆備絾鍏舵湁涓瀹氬紛鐥咃紝鍥犱負java涓嶆敮鎸佸緇ф壙錛岃繖灝遍檺鍒朵簡浣跨敤榪欎釜妯″紡鐨勭伒媧繪с傛墍浠ユ垜瑙夊緱浠ュ悗濡傛灉鐪熺殑鐢ㄥ埌Observer妯″紡榪樻槸鑷繁緙栫▼姣旇緝濂姐?/span>
浠ュ墠宸茬粡鐪嬭繃涓ょ珷浜嗭紝瀹炲湪澶繃涔呰繙錛屽彧寰楅噸娓╀竴涓嬨?/span>
鍓嶉潰鐨?/span> Introduction 鍏跺疄鏄潪甯告湁鎰忔濈殑錛屽湪榪欏厛涓嶈禈榪頒簡銆?/span>
浠嬬粛鐨勭涓涓?/span> Pattern 鏄?/span> Strategy Pattern 銆?/span>
閫氳繃涓涓?/span> duck 鐨勪緥瀛愶紝鍦ㄨ榪?/span> Strategy Pattern 鐨勮繃紼嬩腑寮曞嚭浜嗕笁涓?/span> Design Principles
瀹冧滑鏄細
1錛?span style="FONT: 7pt 'Times New Roman'">聽聽聽聽聽聽聽聽聽聽聽聽聽
Identify the aspects of your application that vary and separate them from what stays the same.
2錛?span style="FONT: 7pt 'Times New Roman'">聽聽聽聽聽聽聽聽聽聽聽聽聽
Program to an interface, not an implementation.
3錛?span style="FONT: 7pt 'Times New Roman'">聽聽聽聽聽聽聽聽聽聽聽聽聽
Favor composition over inheritance.
Duck 渚嬪瓙瀹岀編鍦頒綋鐜頒簡浠ヤ笂涓変釜 Principles 銆?/span>
涓寮濮?/span> Duck 綾繪槸榪欐牱鐨勶紝閲岄潰鏈変笁涓柟娉曪細 quack(), swim() 鍜?/span> display(), 鍏跺畠涓浜涚壒孌婄殑 Duck 瀛愮被緇ф壙榪欎釜鐖剁被錛屽茍閲嶈澆 display 鏂規硶鍘繪樉紺哄悇縐嶄笉鍚岀綾葷殑 Duck 銆?/span>
鐜板湪闇姹傚彉鏇達紝闇瑕佽涓浜?/span> Duck 鑳藉鏈夐鐨勮兘鍔涳紝鐞嗘墍褰撶劧鍦幫紝鍦ㄧ埗綾諱腑鍔犱笂浜?/span> fly() 榪欎釜鏂規硶銆備絾涓浜涗笉鑳介鐨?/span> Duck 綾誨嵈鍚屾椂鎷ユ湁浜?/span> fly() 鏂規硶錛岃繖鏄劇劧鏄笉瀵圭殑銆?/span>
鍙兘鏈変漢鎻愬嚭瑙e喅鐨勬柟娉曟槸閲嶈澆閭d簺涓嶉渶瑕?/span> fly() 鏂規硶鐨?/span> duck 綾葷殑 fly() 錛岃榪欎釜鏂規硶浠涔堜篃涓嶅仛錛屼絾浣犳湁娌℃湁鎯寵繃濡傛灉榪欎箞澶勭悊錛屼互鍚庡啀鍔犱竴浜涗笉闇瑕佷竴浜涙柟娉曠殑瀛愮被鏄笉鏄緢綣佺悙錛?/span>
涔熻鍙堟湁浜烘兂鍒頒簡錛屾妸 fly() 鍜?/span> quack() 鎻愬彇鍑烘潵錛岀紪紼?/span> interface 銆傚鏋滄煇涓瓙綾婚渶瑕佽繖涓兘鍔涘彲浠ュ幓 implement 榪欎釜 interface 銆?/span>
鏈夋病鏈夋兂榪囧悗鏋滐紵姣忎竴涓瓙綾婚兘瑕侀噸鍐?/span> fly() 鍜?/span> quack(),OO 鐨勪唬鐮侀噸鐢ㄧ殑鐗規ц崱鐒舵棤瀛樸?/span>
閭d粈涔堟墠鏄渶濂界殑瑙e喅涔嬮亾鍛紵錛燂紵
涔﹂噷闈㈢粰鍑轟簡絳旀銆?/span>
鎶?/span> fly() 鍜?/span> quack() 涓や釜鍔熻兘鎻愬彇鍑烘潵榪欎釜鎬濊礬鏄鐨勩?b style="mso-bidi-font-weight: normal">榪欓噷浣撶幇浜嗙涓涓?/span> Principle 銆傞鍏堝0鏄?/span> FlyBehavior() 鍜?/span> QuackBehavior() 涓や釜 interface 錛岀劧鍚庡疄鐜板悇縐?/span> fly 鍜?/span> quack 錛屾瘮濡?/span> FlyWithWings, FlyNoWay 錛?/span> Quack, Squeak 絳夌瓑銆?b style="mso-bidi-font-weight: normal">榪欓噷浣撶幇浜嗙浜屼釜 Principle 銆?/span>
鐜板湪鐨?/span> Duck 鐖剁被宸茬粡鍙樹簡錛岄噷闈㈡湁涓や釜縐佹湁鍙橀噺 FlyBehavior fb, 鍜?/span> QuackBehavior qb 銆?/span>
Duck 鐖剁被鐢氳嚦鍙互鐩存帴澹版槑鎴?/span> Abstract 綾伙紝褰撴湁瀛愮被緇ф壙瀹冪殑鏃跺欙紝鍙互鍦ㄦ瀯閫犲嚱鏁伴噷緇?/span> fb 鍜?/span> qb 鍒濆鍖栫殑鏃跺欑洿鎺ヨ祴緇欏畠闇瑕佺殑 fly 鍜?/span> quack 縐嶇被銆?b style="mso-bidi-font-weight: normal">榪欓噷浣撶幇浜嗙涓変釜 Principle 銆?/span>
灝忓皬鐨勪竴涓緥瀛愬凡緇忓垎鏋愮殑閭d箞涓撲笟錛岃鎴戝彈鐩婂尓嫻呫傚ソ涔︼紒