锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
Reference錛?br />聽聽聽1.http://www.javaworld.com/javaworld/javatips/jw-javatip98.html
聽聽聽2.http://www.theserverside.com/patterns/thread.tss?thread_id=43755
聽聽聽3.http://www.nshen.net/designpattern/DesignPattern/VisitorPattern.htm
]]>
2ed: mappings.setAutoImport((aiNode == null) ? true : "true".equals(aiNode.getValue()));
the first is seems a bit more effective than the second but less readable ,hence we choose the second!
bad聽programmer write code readed by machine and by contraries good programmer write code readed by human!
]]>
]]>
I found this when i read the org.hibernate.hql.ast.util.NodeTraverser.by the way,the command pattern is somewhat like those way.
]]>
銆銆Decorator妯″紡綆浠?
銆銆Decorator妯″紡鍙堝悕鍖呰鍣?Wrapper)錛屽畠鐨勪富瑕佺敤閫斿湪浜庣粰涓涓璞″姩鎬佺殑娣誨姞涓浜涢澶栫殑鑱岃矗銆備笌鐢熸垚瀛愮被鐩告瘮錛屽畠鏇村叿鏈夌伒媧繪с?br />鏈夋椂鍊欙紝鎴戜滑闇瑕佷負涓涓璞¤屼笉鏄暣涓被娣誨姞涓浜涙柊鐨勫姛鑳斤紝姣斿錛岀粰涓涓枃鏈尯娣誨姞涓涓粴鍔ㄦ潯鐨勫姛鑳姐傛垜浠彲浠ヤ嬌鐢ㄧ戶鎵挎満鍒舵潵瀹炵幇榪欎竴鍔熻兘錛屼絾鏄繖縐嶆柟娉曚笉澶熺伒媧伙紝鎴戜滑鏃犳硶鎺у埗鏂囨湰鍖哄姞婊氬姩鏉$殑鏂瑰紡鍜屾椂鏈恒傝屼笖褰撴枃鏈尯闇瑕佹坊鍔犳洿澶氱殑鍔熻兘鏃訛紝姣斿杈規(guī)絳夛紝闇瑕佸垱寤烘柊鐨勭被錛岃屽綋闇瑕佺粍鍚堜嬌鐢ㄨ繖浜涘姛鑳芥椂鏃犵枒灝嗕細寮曡搗綾葷殑鐖嗙偢銆?br />
銆銆鎴戜滑鍙互浣跨敤涓縐嶆洿涓虹伒媧葷殑鏂規(guī)硶錛屽氨鏄妸鏂囨湰鍖哄祵鍏ュ埌婊氬姩鏉′腑銆傝岃繖涓粴鍔ㄦ潯鐨勭被灝辯浉褰撲簬瀵規(guī)枃鏈尯鐨勪竴涓?strong>瑁呴グ銆傝繖涓楗?婊氬姩鏉?蹇呴』涓庤瑁呴グ鐨勭粍浠?鏂囨湰鍖?緇ф壙鑷悓涓涓帴鍙o紝榪欐牱錛岀敤鎴峰氨涓嶅繀鍏沖績瑁呴グ鐨勫疄鐜幫紝鍥犱負榪欏浠栦滑鏉ヨ鏄忔槑鐨勩傝楗頒細灝嗙敤鎴風殑璇鋒眰杞彂緇欑浉搴旂殑緇勪歡(鍗寵皟鐢ㄧ浉鍏崇殑鏂規(guī)硶)錛屽茍鍙兘鍦ㄨ漿鍙戠殑鍓嶅悗鍋氫竴浜涢澶栫殑鍔ㄤ綔(濡傛坊鍔犳粴鍔ㄦ潯)銆傞氳繃榪欑鏂規(guī)硶錛屾垜浠彲浠ユ牴鎹粍鍚堝鏂囨湰鍖哄祵濂椾笉鍚岀殑瑁呴グ錛屼粠鑰屾坊鍔犱換鎰忓鐨勫姛鑳姐傝繖縐嶅姩鎬佺殑瀵瑰璞℃坊鍔犲姛鑳界殑鏂規(guī)硶涓嶄細寮曡搗綾葷殑鐖嗙偢錛屼篃鍏鋒湁浜嗘洿澶氱殑鐏墊椿鎬с?br />
銆銆浠ヤ笂鐨勬柟娉曞氨鏄?strong>Decorator妯″紡錛屽畠閫氳繃緇欏璞℃坊鍔犺楗版潵鍔ㄦ佺殑娣誨姞鏂扮殑鍔熻兘銆傚涓嬫槸Decorator妯″紡鐨刄ML鍥撅細
銆銆Component涓虹粍浠跺拰瑁呴グ鐨勫叕鍏辯埗綾伙紝瀹冨畾涔変簡瀛愮被蹇呴』瀹炵幇鐨勬柟娉曘?br />
銆銆ConcreteComponent鏄竴涓叿浣撶殑緇勪歡綾伙紝鍙互閫氳繃緇欏畠娣誨姞瑁呴グ鏉ュ鍔犳柊鐨勫姛鑳姐?br />
銆銆Decorator鏄墍鏈夎楗扮殑鍏叡鐖剁被錛屽畠瀹氫箟浜嗘墍鏈夎楗板繀欏誨疄鐜扮殑鏂規(guī)硶錛屽悓鏃訛紝瀹冭繕淇濆瓨浜嗕竴涓浜嶤omponent鐨勫紩鐢紝浠ヤ究灝嗙敤鎴風殑璇鋒眰杞彂緇機omponent錛屽茍鍙兘鍦ㄨ漿鍙戣姹傚墠鍚庢墽琛屼竴浜涢檮鍔犵殑鍔ㄤ綔銆?br />
銆銆ConcreteDecoratorA鍜孋oncreteDecoratorB鏄叿浣撶殑瑁呴グ錛屽彲浠ヤ嬌鐢ㄥ畠浠潵瑁呴グ鍏蜂綋鐨凜omponent銆?br />
銆銆Java IO鍖呬腑鐨凞ecorator妯″紡
銆銆JDK鎻愪緵鐨刯ava.io鍖呬腑浣跨敤浜咲ecorator妯″紡鏉ュ疄鐜板鍚勭杈撳叆杈撳嚭嫻佺殑灝佽銆備互涓嬪皢浠ava.io.OutputStream鍙婂叾瀛愮被涓轟緥錛岃璁轟竴涓婦ecorator妯″紡鍦↖O涓殑浣跨敤銆?br />
銆銆棣栧厛鏉ョ湅涓孌電敤鏉ュ垱寤篒O嫻佺殑浠g爜錛?br />
浠ヤ笅鏄唬鐮佺墖孌碉細
try {
銆OutputStream out = new DataOutputStream(new FileOutputStream("test.txt"));
} catch (FileNotFoundException e) {
銆e.printStackTrace();
}
銆銆榪欐浠g爜瀵逛簬浣跨敤榪嘕AVA杈撳叆杈撳嚭嫻佺殑浜烘潵璇村啀鐔熸?zhèn)変笉杩囦簡锛屾垜浠娇鐢―ataOutputStream灝佽浜嗕竴涓狥ileOutputStream銆傝繖鏄竴涓吀鍨嬬殑Decorator妯″紡鐨勪嬌鐢紝FileOutputStream鐩稿綋浜嶤omponent錛孌ataOutputStream灝辨槸涓涓狣ecorator銆傚皢浠g爜鏀規(guī)垚濡備笅錛屽皢浼氭洿瀹規(guī)槗鐞嗚В錛?br />
浠ヤ笅鏄唬鐮佺墖孌碉細
try {
銆OutputStream out = new FileOutputStream("test.txt");
銆out = new DataOutputStream(out);
} catch(FileNotFoundException e) {
銆e.printStatckTrace();
}
銆銆鐢變簬FileOutputStream鍜孌ataOutputStream鏈夊叕鍏辯殑鐖剁被OutputStream錛屽洜姝ゅ瀵硅薄鐨勮楗板浜庣敤鎴鋒潵璇村嚑涔庢槸閫忔槑鐨勩備笅闈㈠氨鏉ョ湅鐪婳utputStream鍙婂叾瀛愮被鏄浣曟瀯鎴怐ecorator妯″紡鐨勶細
OutputStream鏄竴涓娊璞$被錛屽畠鏄墍鏈夎緭鍑烘祦鐨勫叕鍏辯埗綾伙紝鍏舵簮浠g爜濡備笅錛?浠ヤ笅鏄唬鐮佺墖孌碉細
public abstract class OutputStream implements Closeable, Flushable {
public abstract void write(int b) throws IOException;
...
}
瀹冨畾涔変簡write(int b)鐨勬娊璞℃柟娉曘傝繖鐩稿綋浜嶥ecorator妯″紡涓殑Component綾匯?
ByteArrayOutputStream錛孎ileOutputStream 鍜?PipedOutputStream 涓変釜綾婚兘鐩存帴浠嶰utputStream緇ф壙錛屼互ByteArrayOutputStream涓轟緥錛?浠ヤ笅鏄唬鐮佺墖孌碉細
public class ByteArrayOutputStream extends OutputStream {
protected byte buf[];
protected int count;
public ByteArrayOutputStream() {
this(32);
}
public ByteArrayOutputStream(int size) {
if (size 銆?0) {
throw new IllegalArgumentException("Negative initial size: " + size);
}
buf = new byte[size];
}
public synchronized void write(int b) {
int newcount = count + 1;
if (newcount 銆?buf.length) {
byte newbuf[] = new byte[Math.max(buf.length 銆堛?1, newcount)];
System.arraycopy(buf, 0, newbuf, 0, count);
buf = newbuf;
}
buf[count] = (byte)b;
count = newcount;
}
...
}
瀹冨疄鐜頒簡OutputStream涓殑write(int b)鏂規(guī)硶錛屽洜姝ゆ垜浠彲浠ョ敤鏉ュ垱寤鴻緭鍑烘祦鐨勫璞★紝騫跺畬鎴愮壒瀹氭牸寮忕殑杈撳嚭銆傚畠鐩稿綋浜嶥ecorator妯″紡涓殑ConcreteComponent綾匯?
鎺ョ潃鏉ョ湅涓涓婩ilterOutputStream錛屼唬鐮佸涓嬶細 浠ヤ笅鏄唬鐮佺墖孌碉細
public class FilterOutputStream extends OutputStream {
protected OutputStream out;
public FilterOutputStream(OutputStream out) {
this.out = out;
}
浠ヤ笅鏄唬鐮佺墖孌碉細
public class BufferedOutputStream extends FilterOutputStream {
...
private void flushBuffer() throws IOException {
if (count 銆?0) {
out.write(buf, 0, count);
count = 0;
}
}
public synchronized void write(int b) throws IOException {
if (count 銆? buf.length) {
flushBuffer();
}
buf[count++] = (byte)b;
}
...
}
銆銆榪欎釜綾繪彁渚涗簡涓涓紦瀛樻満鍒訛紝絳夊埌緙撳瓨鐨勫閲忚揪鍒頒竴瀹氱殑瀛楄妭鏁版椂鎵嶅啓鍏ヨ緭鍑烘祦銆傞鍏堝畠緇ф壙浜咶ilterOutputStream錛屽茍涓旇鐩栦簡鐖剁被鐨剋rite(int b)鏂規(guī)硶錛屽湪璋冪敤杈撳嚭嫻佸啓鍑烘暟鎹墠閮戒細媯鏌ョ紦瀛樻槸鍚﹀凡婊★紝濡傛灉鏈弧錛屽垯涓嶅啓銆傝繖鏍峰氨瀹炵幇浜嗗杈撳嚭嫻佸璞″姩鎬佺殑娣誨姞鏂板姛鑳界殑鐩殑銆?br />
銆銆涓嬮潰錛屽皢浣跨敤Decorator妯″紡錛屼負IO鍐欎竴涓柊鐨勮緭鍑烘祦銆?/p>
銆銆鑷繁鍐欎竴涓柊鐨勮緭鍑烘祦
銆銆浜嗚В浜哋utputStream鍙婂叾瀛愮被鐨勭粨鏋勫師鐞嗗悗錛屾垜浠彲浠ュ啓涓涓柊鐨勮緭鍑烘祦錛屾潵娣誨姞鏂扮殑鍔熻兘銆傝繖閮ㄥ垎涓皢緇欏嚭涓涓柊鐨勮緭鍑烘祦鐨勪緥瀛愶紝瀹冨皢榪囨護寰呰緭鍑鴻鍙ヤ腑鐨勭┖鏍肩鍙楓傛瘮濡傞渶瑕佽緭鍑?java io OutputStream"錛屽垯榪囨護鍚庣殑杈撳嚭涓?javaioOutputStream"銆備互涓嬩負SkipSpaceOutputStream綾葷殑浠g爜錛?br />
浠ヤ笅鏄唬鐮佺墖孌碉細
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* A new output stream, which will check the space character
* and won鈥檛 write it to the output stream.
* @author Magic
*
*/
public class SkipSpaceOutputStream extends FilterOutputStream {
銆public SkipSpaceOutputStream(OutputStream out) {
銆銆super(out);
銆}
銆/**
銆* Rewrite the method in the parent class, and
銆* skip the space character.
銆*/
銆public void write(int b) throws IOException{
銆銆if(b!=鈥?鈥?{
銆銆銆super.write(b);
銆銆}
銆}
}
銆銆瀹冧粠FilterOutputStream緇ф壙錛屽茍涓旈噸鍐欎簡瀹冪殑write(int b)鏂規(guī)硶銆傚湪write(int b)鏂規(guī)硶涓鍏堝杈撳叆瀛楃榪涜浜嗘鏌ワ紝濡傛灉涓嶆槸絀烘牸錛屽垯杈撳嚭銆?br />
銆銆浠ヤ笅鏄竴涓祴璇曠▼搴忥細
浠ヤ笅鏄唬鐮佺墖孌碉細
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* Test the SkipSpaceOutputStream.
* @author Magic
*
*/
public class Test {
銆public static void main(String[] args){
銆銆byte[] buffer = new byte[1024];
銆銆/**
銆銆* Create input stream from the standard input.
銆銆*/
銆銆InputStream in = new BufferedInputStream(new DataInputStream(System.in));
銆銆/**
銆銆* write to the standard output.
銆銆*/
銆銆OutputStream out = new SkipSpaceOutputStream(new DataOutputStream(System.out));
銆銆try {
銆銆銆System.out.println("Please input your words: ");
銆銆銆int n = in.read(buffer,0,buffer.length);
銆銆銆for(int i=0;i銆坣;i++){
銆銆銆銆out.write(buffer[i]);
銆銆銆}
銆銆} catch (IOException e) {
銆銆銆e.printStackTrace();
銆銆}
銆}
}
銆銆鎵ц浠ヤ笂嫻嬭瘯紼嬪簭錛屽皢瑕佹眰鐢ㄦ埛鍦╟onsole紿楀彛涓緭鍏ヤ俊鎭紝紼嬪簭灝嗚繃婊ゆ帀淇℃伅涓殑絀烘牸錛屽茍灝嗘渶鍚庣殑緇撴灉杈撳嚭鍒癱onsole紿楀彛銆傛瘮濡傦細
浠ヤ笅鏄紩鐢ㄧ墖孌碉細
Please input your words:
a b c d e f
abcdef
銆銆鎬?緇?/strong>
銆銆鍦╦ava.io鍖呬腑錛屼笉浠匫utputStream鐢ㄥ埌浜咲ecorator璁捐妯″紡錛孖nputStream錛孯eader錛學riter絳夐兘鐢ㄥ埌浜嗘妯″紡銆傝屼綔涓轟竴涓伒媧葷殑錛屽彲鎵╁睍鐨勭被搴擄紝JDK涓嬌鐢ㄤ簡澶ч噺鐨勮璁℃ā寮忥紝姣斿鍦⊿wing鍖呬腑鐨凪VC妯″紡錛孯MI涓殑Proxy妯″紡絳夌瓑銆傚浜嶫DK涓ā寮忕殑鐮旂┒涓嶄粎鑳藉姞娣卞浜庢ā寮忕殑鐞嗚В錛岃屼笖榪樻湁鍒╀簬鏇撮忓交鐨勪簡瑙g被搴撶殑緇撴瀯鍜岀粍鎴?br />
They are the same Obect basically.Decorator is base on the compent but beyond the compent.
Delegate is a bit like the Decorator.
Bridge妯″紡瀹氫箟 :
灝嗘娊璞″拰琛屼負鍒掑垎寮鏉?鍚勮嚜鐙珛,浣嗚兘鍔ㄦ佺殑緇撳悎銆?/p>
浠諱綍浜嬬墿瀵硅薄閮芥湁鎶借薄鍜岃涓轟箣鍒嗭紝渚嬪浜猴紝浜烘槸涓縐嶆娊璞★紝浜哄垎鐢蜂漢鍜屽コ浜虹瓑錛涗漢鏈夎涓猴紝琛屼負涔熸湁鍚勭鍏蜂綋琛ㄧ幇錛屾墍浠ワ紝鈥滀漢鈥濅笌鈥滀漢鐨勮涓衡濅袱涓蹇典篃鍙嶆槧浜嗘娊璞″拰琛屼負涔嬪垎銆?/p>
鍦ㄩ潰鍚戝璞¤璁$殑鍩烘湰姒傚康涓紝瀵硅薄榪欎釜姒傚康瀹為檯鏄敱灞炴у拰琛屼負涓や釜閮ㄥ垎緇勬垚鐨勶紝...
璁捐妯″紡涔婤ridge Bridge妯″紡瀹氫箟 : 浠諱綍浜嬬墿瀵硅薄閮芥湁鎶借薄鍜岃涓轟箣鍒嗭紝渚嬪浜猴紝浜烘槸涓縐嶆娊璞★紝浜哄垎鐢蜂漢鍜屽コ浜虹瓑錛涗漢鏈夎涓猴紝琛屼負涔熸湁鍚勭鍏蜂綋琛ㄧ幇錛屾墍浠ワ紝鈥滀漢鈥濅笌鈥滀漢鐨勮涓衡濅袱涓蹇典篃鍙嶆槧浜嗘娊璞″拰琛屼負涔嬪垎銆?/p> 鍦ㄩ潰鍚戝璞¤璁$殑鍩烘湰姒傚康涓紝瀵硅薄榪欎釜姒傚康瀹為檯鏄敱灞炴у拰琛屼負涓や釜閮ㄥ垎緇勬垚鐨勶紝灞炴ф垜浠彲浠ヨ涓烘槸涓縐嶉潤姝㈢殑錛屾槸涓縐嶆娊璞★紝涓鑸儏鍐典笅錛岃涓烘槸鍖呭惈鍦ㄤ竴涓璞′腑錛屼絾鏄紝鍦ㄦ湁鐨勬儏鍐典笅錛屾垜浠渶瑕佸皢榪欎簺琛屼負涔熻繘琛屽綊綾伙紝褰㈡垚涓涓葷殑琛屼負鎺ュ彛錛岃繖灝辨槸妗ユā寮忕殑鐢ㄥ銆?/p> 涓轟粈涔堜嬌鐢? 濡傛灉涓涓娊璞$被鎴栨帴鍙f湁澶氫釜鍏蜂綋瀹炵幇(瀛愮被銆乧oncrete subclass),榪欎簺瀛愮被涔嬮棿鍏崇郴鍙兘鏈変互涓嬩袱縐嶆儏鍐? 浣嗘槸錛屾垜浠敞鎰忓埌錛氫笂闈㈠洓涓瓙綾諱腑鏈夋蹇甸噸鍙狅紝鍙粠鍙﹀涓涓搴﹁繘琛岃冭檻錛岃繖鍥涗釜綾誨疄闄呮槸涓や釜瑙掕壊鐨勭粍鍚堬細鎶借薄 鍜岃涓猴紝鍏朵腑鎶借薄涓猴細涓澂鍜屽ぇ鏉紱琛屼負涓猴細鍔犲ザ 涓嶅姞濂訛紙濡傚姞姍欐眮 鍔犺嫻鏋滄眮錛? 瀹炵幇鍥涗釜瀛愮被鍦ㄦ娊璞″拰琛屼負涔嬮棿鍙戠敓浜嗗浐瀹氱殑緇戝畾鍏崇郴錛屽鏋滀互鍚庡姩鎬佸鍔犲姞钁¤悇姹佺殑琛屼負錛屽氨蹇呴』鍐嶅鍔犱袱涓被錛氫腑鏉姞钁¤悇姹佸拰澶ф澂鍔犺憽钀勬眮銆傛樉鐒舵販涔?鎵╁睍鎬ф瀬宸?/p> 閭f垜浠粠鍒嗙鎶借薄鍜岃涓虹殑瑙掑害錛屼嬌鐢˙ridge妯″紡鏉ュ疄鐜般?/p> 濡備綍瀹炵幇? 鍏堢湅鐪嬫娊璞¢儴鍒嗙殑鎺ュ彛浠g爜:
鍏朵腑CoffeeImp 鏄姞涓嶅姞濂剁殑琛屼負鎺ュ彛,鐪嬪叾浠g爜濡備笅:
鐜板湪鎴戜滑鏈変簡涓や釜鎶借薄綾?涓嬮潰鎴戜滑鍒嗗埆瀵瑰叾榪涜緇ф壙,瀹炵幇concrete class:
涓婇潰鍒嗗埆鏄腑鏉拰澶ф澂鐨勫叿浣撳疄鐜?涓嬮潰鍐嶅琛屼負CoffeeImp榪涜緇ф壙:
Bridge妯″紡鐨勫熀鏈鏋舵垜浠凡緇忔惌濂戒簡,鍒繕璁板畾涔変腑榪樻湁涓鍙?鍔ㄦ佺粨鍚?鎴戜滑鐜板湪鍙互鍠濆埌鑷沖皯鍥涚鍜栧暋: 鐪嬬湅鏄浣曞姩鎬佺粨鍚堢殑,鍦ㄤ嬌鐢ㄤ箣鍓?鎴戜滑鍋氫釜鍑嗗宸ヤ綔,璁捐涓涓崟鎬佺被(Singleton)鐢ㄦ潵hold褰撳墠鐨凜offeeImp:
鐪嬬湅涓澂鍔犲ザ 鍜屽ぇ鏉姞濂?鏄庝箞鍑烘潵鐨? //鎷垮嚭鐗涘ザ 娉ㄦ剰: Bridge妯″紡鐨勬墽琛岀被濡侰offeeImp鍜孋offee鏄竴瀵逛竴鐨勫叧緋? 姝g‘鍒涘緩CoffeeImp鏄妯″紡鐨勫叧閿? Bridge妯″紡鍦‥JB涓殑搴旂敤 1.Business Object (綾諱技Coffee) 瀹炵幇涓浜涙娊璞$殑鍟嗕笟鎿嶄綔:濡傚鎵句竴涓敤鎴蜂笅鎵鏈夌殑璁㈠崟 娑夊強鏁版嵁搴撴搷浣滈兘浣跨敤DAOImplementor. 2.Data Access Object (綾諱技CoffeeImp) 涓浜涙娊璞$殑瀵規(guī)暟鎹簱璧勬簮鎿嶄綔 3.DAOImplementor 濡侽rderDAOCS, OrderDAOOracle, OrderDAOSybase(綾諱技MilkCoffeeImp FragrantCoffeeImp) 鍏蜂綋鐨勬暟鎹簱鎿嶄綔,濡?INSERT INTO "絳夎鍙?OrderDAOOracle鏄疧racle OrderDAOSybase鏄疭ybase鏁版嵁搴? 4.鏁版嵁搴?(Cloudscape, Oracle, or Sybase database via JDBC API) |