濡傛灉鍐欎竴涓被鐨勬柟娉?鎸夌収榪欎釜闇姹傛潵鍐檌f璇彞,鍙互,浣嗘槸,濡傛灉鏈変袱濂楀畾鍒剁殑鍛?涓濂楅渶瑕佸叾涓殑鍑犵鍙樺寲,鍙﹀闇瑕佸彟澶栧嚑縐?閭d箞灝遍渶瑕?涓柟娉?鑰屼笖鍏朵腑鏈夊緢澶氱殑閲嶅浠g爜,榪欐牱琛屼笉閫氱殑.
鍏跺疄璁捐妯″紡璇村埌搴?鍏舵牴鏈濇兂灝辨槸鎵懼埌鍙樺寲騫跺皝瑁呬箣.榪欓噷鍙樺寲鐨勬槸澶勭悊鐨勬柟娉?閭d箞鎴戜滑灝辨妸瀹冨皝瑁呰搗鏉?瀹炵幇鐨勭被濡備笅:
package decorater;
public class Integor {
private Integer x;
public Integer getX() {
return x;
}
public void setX(Integer x) {
this.x = x;
}
Integor(Integer x){
this.x = x;
}
}
鐢變簬Integer涓嶈兘淇敼浼犻掔殑鍊?鎵浠ュ啓涓涓被鏉ュ皝瑁呬竴涓猧nteger
/**
*
*/
package decorater;
public abstract class Decorater {
private Decorater next;
public Decorater setNext(Decorater dcrtr) {
this.next = dcrtr;
return this.next;
}
public void process(Integor x) {
this.executeBefore(x);
if (this.next != null) {
this.next.process(x);
}
this.executeAfter(x);
}
protected abstract void executeBefore(Object x);
protected abstract void executeAfter(Object x);
}
姣忎釜瀹炵幇鐨勭被鍙渶瑕佹潵瀹炵幇executeBefore鍜宔xecuteAfter鏂規硶鍗沖彲.
娉ㄦ剰瀹炵幇鐨勯『搴忔槸
decorater1.executeBefore->decorater2.executeBefore->decorater3.executeBefore->decorater3.executeAfter->decorater2.executeAfter->decorater1.executerAfter
package decorater;
public class PositiveDecorater extends Decorater {
@Override
protected void executeAfter(Object x) {
System.out.println("PositiveDecorater end!");
}
@Override
protected void executeBefore(Object x) {
// TODO Auto-generated method stub
System.out.println("starting PositiveDecorater!");
Integor in = (Integor) x;
if (in.getX() < 0)
in.setX(-in.getX());
}
}
package decorater;
public class Devide2Decorater extends Decorater {
@Override
protected void executeAfter(Object x) {
System.out.println("Devide2Decorater end!");
}
@Override
protected void executeBefore(Object x) {
System.out.println("Starting Devide2Decorater!");
Integor in = (Integor) x;
if (in.getX() % 2 == 0) {
in.setX(in.getX() / 2);
}
}
}
package decorater;
public class Devide3Decorater extends Decorater {
@Override
protected void executeAfter(Object x) {
System.out.println("Devide3Decorater end!");
}
@Override
protected void executeBefore(Object x) {
System.out.println("Starting Devide3Decorater!");
Integor in = (Integor) x;
if (in.getX() % 3 == 0) {
in.setX(in.getX() / 3);
}
}
}
/**
*
*/
package decorater;
/**
* @author KONGHE
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Decorater a = new PositiveDecorater();
a.setNext(new Devide2Decorater()).setNext(new Devide3Decorater());
Integor x = new Integor(-18);
a.process(x);
System.out.println(x.getX());
}
}
杈撳嚭緇撴灉鏄?
starting PositiveDecorater!
Starting Devide2Decorater!
Starting Devide3Decorater!
Devide3Decorater end!
Devide2Decorater end!
PositiveDecorater end!
3
鍏跺疄姣忕璁捐妯″紡鐨勬牳蹇冩濇兂閮芥槸涓鑷寸殑,浣嗘槸娌℃湁蹇呰鐓ф湰瀹g,鍙娉ㄦ剰鍏舵ā寮忕殑綺鵑珦,灝卞彲浠ヤ簡,鍓╀笅鐨勫氨鏄嚜宸卞幓鎸夌収瀹炵幇鏉ヨ璁″叾涓殑緇嗚妭浜?姣斿鎴戣璁¤繖涓ā寮?灝辨槸鍏堝啓浜唌ain鍑芥暟,鎶婂叾涓殑鏂規硶鍐欏ソ,鐒跺悗鍘繪寜鐓ц繖涓疄鐜版潵鎯沖幓濡備綍瀹炵幇,榪欐牱鎵嶆洿絎﹀悎瑙e喅瀹為檯鐨勯棶棰?鍏跺疄decorater妯″紡鏈夊緢澶氱瀹炵幇鏂瑰紡.姣斿涓嬮潰鐨勮繖縐嶈В娉?涔熷彲:
/**
*
*/
package decorator;
/**
* @author KONGHE
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
DecoraterChain a = new DecoraterChain();
a.setNext(new PositiveDecorater()).setNext(new Devide2Decorater()).setNext(new Devide3Decorater());
Integer x = -32;
x = a.process(x);
System.out.println(x);
}
}
/**
*
*/
package decorator;
import java.util.ArrayList;
import java.util.List;
/**
* @author KONGHE
*
*/
public class DecoraterChain {
private List<Decorater> decorater = new ArrayList<Decorater>();
public DecoraterChain setNext(Decorater decrter) {
decorater.add(decrter);
return this;
}
public Integer process(Integer x) {
for (int i = 0; i < this.decorater.size(); i++) {
x = this.decorater.get(i).process(x);
}
return x;
}
}
/**
*
*/
package decorator;
/**
* @author KONGHE
*
*/
public abstract class Decorater {
public abstract Integer process(Integer x);
}
鎬昏岃█涔?妯″紡鏄負浜嗗叿浣撶殑瀹為檯鎯呭喌鑰屾湇鍔$殑,涓嶈涓轟簡涓瀹氳鍘葷敤鏌愮璁捐妯″紡鑰屽灞堣嚜宸辯殑闇姹?
鍦ㄨ璁$殑鏃跺欏鎯蟲兂,鍙兘鏌愬ぉ浣犲啀璇昏璁℃ā寮忕殑涔?浣犱細鍙戠幇,鍘熸潵鎴戜箣鍓嶅啓鐨勪唬鐮?鍖呭惈浜嗚繖涔堝鐨勮璁℃ā寮忓晩!

]]>