锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
銆銆璁℃暟浠g悊妯″紡鍦ㄥ鎴峰璞¤皟鐢ㄦ湇鍔℃彁渚涜呭璞′笂鏂規硶鐨勫墠鍚庢墽琛岃濡傛棩蹇楋紙logging錛夊拰璁℃暟錛坈ounting錛変竴緋誨垪闄勫姞
鍔熻兘鏃跺緢鏈夌敤銆傝鏁頒唬鐞嗘ā寮忓緩璁妸榪欎簺闄勫姞鍔熻兘灝佽鍦ㄤ竴涓崟鐙殑瀵硅薄錛岃繖涓璞″氨鏄寚璁℃暟浠g悊瀵硅薄錛岃屼笉鏄妸榪欎簺闄勫姞鐨勫姛鑳藉疄鐜版斁鍒版湇鍔℃彁渚涜呯殑鍐呴儴銆傝壇
濂界殑瀵硅薄璁捐鐨勪竴涓壒寰佸氨鏄璞¤涓撴敞浜庢彁渚涚壒瀹氱殑鍔熻兘銆傛崲鍙ヨ瘽璇達紝鐞嗘兂鐨勫璞′笉搴旇鍋氬悇縐嶄笉鐩稿共鐨勪簨鎯呫傛妸璇稿鏃ュ織錛坙ogging錛夊拰璁℃暟
錛坈ounting錛夌瓑綾諱技鐨勫姛鑳藉皝瑁呬負涓涓崟鐙殑瀵硅薄錛岃岃鏈嶅姟鎻愪緵鑰呭璞′粎鎻愪緵瀹冭嚜宸辯殑鐗瑰畾鍔熻兘銆備篃灝辨槸璇達紝鍙厑璁告湇鍔℃彁渚涜呭璞℃墽琛屽畾涔夎壇濂姐佺壒瀹?
鐨勪換鍔°?br>
銆銆璁℃暟浠g悊琚璁℃垚鍙互琚鎴瘋闂殑涓庢湇鍔℃彁渚涜呭叿鏈夌浉鍚屾帴鍙g殑瀵硅薄銆傚鎴峰璞′笉鏄洿鎺ヨ闂湇鍔℃彁渚涜咃紝鑰屾槸璋冪敤璁℃暟浠g悊瀵硅薄涓婄殑鏂規硶錛岃鏁頒唬鐞嗘墽琛屽繀瑕佺殑綰綍鏃ュ織錛坙ogging錛夊拰璁℃暟錛坈ounting錛夊姛鑳藉悗錛屽啀鎶婃柟娉曡皟鐢ㄤ紶閫掔粰鏈嶅姟鎻愪緵鐫瀵硅薄銆傚鍥?
Figure1: Generic Class Association When the Counting Proxy Pattern Is Applied
銆銆涓嬮潰鐨勪緥瀛愯鏄庝簡濡備綍鍦ㄥ簲鐢ㄧ▼搴忎腑鍒╃敤璁℃暟浠g悊銆?br>
銆銆渚嬪瓙錛?br>
銆銆璁╂垜浠璁′竴涓狾rder綾伙紝綾誨眰嬈″鍥?錛孫rderIF鎺ュ彛澹版槑浜唃etAllOrders璇誨彇鏁版嵁搴撲腑鎵鏈夎鍗曠殑綆鍗曟柟娉曘?br>
Figure2: Order Class Hierarchy
public interface OrderIF {
public Vector getAllOrders();
}
銆銆浣滀負getAllOrders鏂規硶瀹炵幇鐨勪竴閮ㄥ垎錛孫rder綾誨疄鐢ㄤ簡FileUtil宸ュ叿綾諱粠order.txt鏂囦歡涓鍙栬鍗曢」銆?br>
public class Order implements OrderIF {
銆public Vector getAllOrders() {
銆銆FileUtil fileUtil = new FileUtil();
銆銆Vector v = fileUtil.fileToVector("orders.txt");
銆銆return v;
銆}
}
銆銆璁╂垜浠亣瀹氬湪璋冪敤getAllOrders()鏃訛紝闇瑕佹妸鍙栨暟鎹枃浠舵墍鑺辮垂鐨勬椂闂村拰璁板綍鏉℃暟瑕佽褰曠殑log鏃ュ織鏂囦歡涓?br>
銆銆榪欎釜闄勫姞鐨勫姛鑳藉彲浠ヨ璁′竴涓崟鐙殑OrderProxy綾繪潵瀹炵幇錛屽畠涓庣湡瀹炲璞rder涓鏍峰疄鐜癘rderIF鎺ュ彛銆傝繖鏍蜂繚璇佷簡OrderProxy瀵硅薄鎻愪緵緇欏鎴蜂笌鐪熷疄瀵硅薄Order涓鏍風殑鎺ュ彛銆傚鍥?
public class OrderProxy implements OrderIF {
銆private int counter = 0;
銆public Vector getAllOrders() {
銆銆Order order = new Order();
銆銆counter++;
銆銆long t1 = System.currentTimeMillis ();
銆銆Vector v = order.getAllOrders();
銆銆long t2 = System.currentTimeMillis();
銆銆long timeDiff = t2 ? t1;
銆銆String msg = "Iteration=" + counter + "::Time=" + timeDiff + "ms";
銆銆//log the message
銆銆FileUtil fileUtil = new FileUtil();
銆銆fileUtil.writeToFile("log.txt鈥?msg, true, true);
銆銆return v;
銆}
}
銆
銆瀹㈡埛瀵硅薄MainApp灝辨兂璋冪敤鐪熷疄瀵硅薄Order涓鏍瘋皟鐢∣rderProxy瀵硅薄涓婄殑getAllOrders()鏂規硶錛孫rderProxy瀵硅薄
浼犻掕繖涓皟鐢ㄧ粰鐪熷疄瀵硅薄Order,璁$畻璇誨彇鎵鏈夎鍗曟墍鑺辮垂鐨勬椂闂村茍浣跨敤FileUtil甯姪綾誨皢鍏剁邯褰曠殑log鏃ュ織鏂囦歡涓傚湪榪欎釜榪囩▼涓紝
OrderProxy鎵紨鑰呰鏁頒唬鐞嗙殑瑙掕壊銆?br>
public class MainApp {
銆public static void main(String[] args) {
銆銆OrderIF order = new OrderProxy();
銆銆Vector v = order.getAllOrders();
銆銆v = order.getAllOrders();
銆銆v = order.getAllOrders();
銆銆v = order.getAllOrders();
銆}
}
]]>
* 綾誨弽灝勫疄鐜板姩鎬佺被璋冪敤
* @param instance 涓涓俊鎭幏鍙栫被鐨勫疄渚?br> * @param methodName 鏂規硶鍚嶇О
* @param classes 鍙傛暟綾誨瀷鏁扮粍
* @param objects 鍙傛暟鏁扮粍
* @return Object 榪斿洖浜嗘柟娉曟墽琛屽悗鐨勭粨鏋?br> */
private Object invokeInstanceMethod(
final Object instance, final String methodName,
final Class[] classes, final Object[] objects) {
try {
Method method;
try {
method = instance.getClass().getDeclaredMethod(methodName, classes);
}
catch (NoSuchMethodException e) {
method = instance.getClass().getMethod(methodName, classes);
}
method.setAccessible(true);
return method.invoke(instance, objects);
}
catch (NoSuchMethodException e) {
throw new RuntimeException(e.getMessage());
}
catch (IllegalAccessException e) {
throw new RuntimeException(e.getMessage());
}
catch (InvocationTargetException e) {
throw new RuntimeException(e.getTargetException().getMessage());
}
}
/* 錛堥潪 Javadoc錛?br> * @see com.eware.dataBaseOperation.dataOperateToolKit
* .dataBaseOperate.InterFaceGetOwnerDataInfo#getOwnerTables()
*/
/**
* 瀹炵幇浜嗘帴鍙f柟娉曡幏鍙栧綋鍓嶇敤鎴鋒墍鏈夎〃鐨勪俊鎭?br> */
public ResultSet getOwnerTables() {
// TODO 鑷姩鐢熸垚鏂規硶瀛樻牴
return (ResultSet)invokeInstanceMethod(goic, "getOwnerTables",
new Class[]{}, new Object[]{});
}
1. 鏅氱殑闈炲唴閮ㄧ被涓嶈兘琚0鏄庝負private鎴?/span>protected錛屽惁鍒欏氨澶卞幓浜嗗垱寤鴻綾葷殑鎰忎箟銆備絾鏄唴閮ㄧ被閫氬父鍙互琚0鏄庝負private鎴?/span>protected綾誨瀷錛屽洜涓鴻繖鏍峰彲浠ラ槻姝粬浜哄璇ュ唴閮ㄧ被瀹炵幇鐨勫姛鑳借繘琛屼慨鏀癸紝杈懼埌闅愯棌瀹炵幇緇嗚妭鐨勭洰鐨勩備緥濡傦細
class Fruit {
private class Weight {
private String i;
private Weight(String j) {
i = j;
}
public String read() {
return i;
}
}
}
class test {
public static void main(String[] args) {
Fruit f = new Fruit();
f.Weight w = f.new Weight(); //涓嶈兘璁塊棶private綾伙紝濡傛灉Weight涓?/span>protected綾誨瀷鍒欏彲浠?/span>
}
}
2. 鍦ㄦ柟娉曟垨鏌愭帶鍒惰鍙?/span>(if/for/while絳?/span>)鐨勪綔鐢ㄥ煙鍐呭畾涔夊唴閮ㄧ被錛屽皢鍙兘鍦ㄨ鑼冨洿鍐呰皟鐢ㄥ唴閮ㄧ被鐨勬柟娉曞拰鎴愬憳鍙橀噺銆?/span>
3. 鍖垮悕鍐呴儴綾繪槸涓縐嶇壒孌婄殑鍐呴儴綾伙紝濡傛灉甯屾湜瀹冧嬌鐢ㄤ竴涓湪鍏跺閮ㄥ畾涔夌殑瀵硅薄錛岄偅涔堢紪璇戝櫒浼氳姹傚叾鍙傛暟寮曠敤鏄?/span>final鐨勩?/span>
public class Fruit {
public Tea cont(final int j) {
return new Tea() {
private int i = j;
public int read() {
return i;
}
}; //娉ㄦ剰榪欓噷鐨勫垎鍙?/span>
}
public static void main(String[] args) {
Fruit f = new Fruit();
Tea t = f.cont;
}
}
鑰屽綋鏂規硶cont(final int j)涓殑鍙傛暟j鍙槸琚紶閫掑埌鍖垮悕綾諱腑鐨勬瀯閫犲櫒鏃訛紝鍙互涓嶇敤琚0鏄庝負final綾誨瀷錛屽return new Tea(j)銆傝繖閲屾彁鍒頒簡鍖垮悕鍐呴儴綾葷殑鏋勯犲櫒錛岄偅涔堝畠鏄庝箞琚垵濮嬪寲鐨勫憿錛?/span>
public class Fruit {
public Tea cont(int j) {
return new Tea(j) {
System.out.println(j);
};
}
}
榪樺彲浠ヨ繖鏍峰垵濮嬪寲鍖垮悕鍐呴儴綾伙細
public class Fruit {
public Tea cont(final int j) {
return new Tea(j) {
int i;
// 鍒濆鍖栧尶鍚嶅唴閮ㄧ被
{
i = j;
System.out.print(i);
}
};
}
}
鏂規硶cont()鍙互琚О涓哄疄渚嬪垵濮嬪寲鏂規硶錛屼嬌寰楀尶鍚嶅唴閮ㄧ被閫氳繃鏋勯犲櫒鑰岃鍒濆鍖栵紝鍦ㄥ疄闄呭簲鐢ㄤ腑錛屾垜浠笉鑳介噸杞藉疄渚嬪垵濮嬪寲鏂規硶錛屽洜涓哄尶鍚嶅唴閮ㄧ被鍙兘鏈変竴涓瀯閫犳柟娉曘?/span>class Mammal extends Animal {
int heartRate;
//緇ф壙weight
...
void breathe() {
...
}
//緇ф壙eat
}
綾誨彧鑳芥墿灞曞彟澶栫殑涓涓被銆傚彧鏀寔鍗曠戶鎵匡紙single inheritance錛夈?/p>
瀛愮被鍙互榪涗竴姝ユ淳鐢熷瓙綾匯?/p>
public abstract class IDEOperation { 銆private Compiler cmp; 銆private Runtime rtime; 銆public void compile(String javaFile) { 銆銆cmp.compile(javaFile); 銆} 銆public void run(String classFile) { 銆銆rtime.run (classFile); 銆} 銆//to be delayed until needed. 銆public abstract void generateDocs(String javaFile); 銆public IDEOperation() { 銆銆cmp = new Compiler(); 銆銆rtime = new Runtime(); 銆} } |
public class RealProcessor extends IDEOperation { 銆JavaDoc jdoc; 銆public RealProcessor() { 銆銆super(); 銆銆jdoc = new JavaDoc(); 銆} 銆public void generateDocs(String javaFile) { 銆銆jdoc.generateDocs(javaFile); 銆} } |
![]() Figure 25.1: IDEOperation Class Hierarchy |
public class ProxyProcessor extends IDEOperation { 銆private RealProcessor realProcessor; 銆public void generateDocs(String javaFile) { 銆銆/* 銆銆In order to generate javadocs 銆銆the proxy loads the actual object and 銆銆invokes its methods. 銆銆*/ 銆銆if (realProcessor == null) { 銆銆銆realProcessor = new RealProcessor(); 銆銆} 銆銆realProcessor.generateDocs(javaFile); 銆} } |
public class Client { 銆public static void main(String[] args) { 銆銆/* 銆銆At this point objects required for 銆銆the compile and run operations are 銆銆created, but not the objects that provide the 銆銆generate Javadoc functionality. 銆銆*/ 銆銆IDEOperation IDE = new ProxyProcessor(); 銆銆IDE.compile("test.java"); 銆銆IDE.run("test.class"); 銆銆/* 銆銆The Javadoc functionality is accessed 銆銆For the first time and hence the 銆銆Object offering the Javadoc generation 銆銆Functionality is loaded at this point. 銆銆*/ 銆銆IDE.generateDocs("test.java"); 銆} } |
1. 璐$尞娉曞垯(Contributin Rule):涓鍒囩殕鏄礎鐚?/font>
2.閬靛驚娉曞垯(Conformance Rule):鎻掍歡蹇呴』閬靛驚棰勬湡鐨勬帴鍙?/font>
3.鍏變韓娉曞垯(sharing Rule):澧炲姞,涓嶈鍙栦唬
4.鏈夋牱瀛︽牱娉曞垯(Monkey See/Monkey Do Rule):閬囧埌闂鏃?棣栧厛澶嶅埗綾諱技鎻掍歡鐨勭粨鏋?/font>
5.鐩稿叧鎬ф硶鍒?Relevance Rule):鍙湁鍦ㄦ搷浣滄湁鍙兘鎴愬姛鏃舵墠鏄劇ず浣犳墍璐$尞鐨勬搷浣?/font>
6.鏁村悎娉曞垯(Integration Rule):瑕佹暣鍚堜笉瑕佸垎瑁?/font>
7.璐d換娉曞垯(Responsibility Rule):鏄庣‘ 鎸囧嚭浣犲紑鍙戠殑鎻掍歡鏃墮棶棰樼殑婧愬ご
8.閽堝API濂戠害緙栫▼娉曞垯(Program To API Contract Rule):棣栧厛媯鏌clipse API濂戠害,鐒跺悗鍚庨拡瀵瑰綰︾紪紼?/font>
9."鍏朵粬"娉曞垯(Other Rule):璁╃敤鎴峰彲浠ラ夋嫨鎵鏈変笢瑗?浣嗘妸閭d簺閫氬父涓嶇敤浜庡綋鍓嶈瑙掔殑閫夐」鏀懼湪Other...瀵硅瘽妗嗕腑
10.IResource閫傞厤娉曞垯(Adapt To IResource Rule):搴旇灝介噺涓洪鍩熷璞″畾涔塈Resource閫傞厤鍣?/font>
11.鍒嗗眰娉曞垯(Strata Rule):灝嗚璦鏃犲叧鐨勫姛鑳戒笌鐗瑰畾浜庡叿浣撹璦鐨勫姛鑳藉垎寮,灝嗘牳蹇冨姛鑳戒笌UI鍔熻兘鍒嗗紑
12.浣跨敤榪炶瘡鎬ф硶鍒?User Continuity Rule):鍦ㄥ嬈″洖璇濇湡闂?搴旇淇濇寔鐢ㄦ埛鐣岄潰鐘舵佷竴鑷?/font>
public class PassHandles {
static void f(PassHandles h) {
System.out.println("h inside f(): " + h);
}
public static void main(String[] args) {
PassHandles
p = new PassHandles();
System.out.println("p inside main(): " + p);
f(p);
}
}
toString 鏂規硶浼氬湪鎵撳嵃璇彞閲岃嚜鍔ㄨ皟鐢紝鑰孭assHandles 鐩存帴浠嶰bject 緇ф壙錛屾病鏈塼oString 鐨勯噸鏂板畾涔夈?br>鍥犳錛岃繖閲屼細閲囩敤toString 鐨凮bject 鐗堟湰錛屾墦鍗板嚭瀵硅薄鐨勭被錛屾帴鐫鏄偅涓璞℃墍鍦ㄧ殑浣嶇疆錛堜笉鏄彞鏌勶紝鑰?br>鏄璞$殑瀹為檯瀛樺偍浣嶇疆錛夈傝緭鍑虹粨鏋滃涓嬶細
p inside main(): PassHandles@1653748
h inside f() : PassHandles@1653748
鍙互鐪嬪埌錛屾棤璁簆 榪樻槸h 寮曠敤鐨勯兘鏄悓涓涓璞°傝繖姣斿鍒朵竴涓柊鐨凱assHandles 瀵硅薄鏈夋晥澶氫簡錛屼嬌鎴戜滑鑳?br>灝嗕竴涓弬鏁板彂緇欎竴涓柟娉曘備絾榪欐牱鍋氫篃甯︽潵浜嗗彟涓涓噸瑕佺殑闂錛氬埆鍚嶉棶棰?/p>
1.閭璇鋒硶鍒?Invitation Rule):灝藉彲鑳界殑閭璇峰埆浜轟負浣犵殑浣滃搧鍋氬嚭璐$尞
2.鎳掑姞杞芥硶鍒?Lazy Loading Rule):鍙湁鍦ㄧ湡姝i渶瑕佺殑鏃跺欐墠鍔犺澆鎻掍歡
3.瀹夊叏騫沖彴娉曞垯(Safe Platform Rule):浣滀負鎵╁睍鐐圭殑鎻愪緵鑰?浣犲繀欏諱繚鎶ゅソ鑷繁,涓嶈璁╂墿灞曡呯殑璇搷浣滅粰浣犻犳垚鎹熷け
4.鍏鉤绔炶禌娉曞垯(Fair Play Rule):鎵鏈変嬌鐢ㄨ呴伒瀹堝悓鏍風殑娓告垙瑙勫垯,鍖呮嫭鎴戣嚜宸?/p>
5.鏄庣‘鎵╁睍娉曞垯(Explicit Extension Rule):鏄庣‘璇存槑騫沖彴鐨勪粈涔堝湴鏂瑰彲渚涙墿灞?/p>
6.鍙戞暎鎬ф硶鍒?Diversity Rule):涓涓墿灞曠偣鎺ョ撼澶氫釜鎵╁睍
7.鑹ソ闃插盡娉曞垯(Good Fences Rule):濡傛灉瑕佷氦鍑虹▼搴忕殑鎺у埗鏉?棣栧厛淇濇姢濂戒綘鑷繁
8.鐢ㄦ埛鍐沖畾娉曞垯(User Arbitration Rule):濡傛灉鏈夊涓夋嫨,鐢辯敤鎴峰喅瀹氫嬌鐢ㄥ摢涓?/p>
9.鏄庣‘API娉曞垯(Explicit API Rule):灝咥PI涓庢彃浠跺唴閮ㄤ嬌鐢ㄧ殑綾誨垎寮
10.紼沖畾鎬ф硶鍒?Stability Rule):濡傛灉浣犲凡緇忓紑濮嬮個璇峰叾浠栦漢浣滃嚭璐$尞,灝變笉瑕佸啀鏀瑰彉瑙勫垯
11.淇濆畧API娉曞垯(Defensive API Rule):鍙毚闇蹭綘鏈変俊蹇冪殑API,浣嗗悓鏃朵篃瑕佸仛濂藉噯澶囨毚闇叉洿澶氱殑API,鍥犱負浣跨敤鑰呬細閭璇蜂綘榪欐牱鍋?/p>
鍚庤皟鐢ㄤ換浣曢渶瑕佺殑鏂規硶