锘??xml version="1.0" encoding="utf-8" standalone="yes"?>精品视频网站,亚洲精品一区二区三区中文字幕,精品不卡视频http://www.aygfsteel.com/jesson2005/category/21671.html鍚鵑潪鏂囦漢錛屼箖甯備簳涓€淇椾漢涔燂紝璇葷櫨鍗蜂功錛岃法姹熸渤鍗冮噷錛屾晠鐢沖煄涓€娓革紱 涓€涓ゆ淮杈涢吀錛屼笁鍥涘勾瀛︿笟錛屼簲鍏偣綺楀ⅷ錛屼竷鍏瑪涔板崠錛屼節鍗侀亾浜烘儏銆?/description>zh-cnWed, 18 Apr 2007 07:02:31 GMTWed, 18 Apr 2007 07:02:31 GMT60Design Pattern: Visitor 妯″紡http://www.aygfsteel.com/jesson2005/articles/111193.html寮犻噾楣?/dc:creator>寮犻噾楣?/author>Tue, 17 Apr 2007 02:53:00 GMThttp://www.aygfsteel.com/jesson2005/articles/111193.htmlhttp://www.aygfsteel.com/jesson2005/comments/111193.htmlhttp://www.aygfsteel.com/jesson2005/articles/111193.html#Feedback0http://www.aygfsteel.com/jesson2005/comments/commentRss/111193.htmlhttp://www.aygfsteel.com/jesson2005/services/trackbacks/111193.html
鐒惰€岀従鍦ㄦ湁鍊嬪晱欏屾槸錛屽鏋滄偍鐨勯泦鍚堬紙connection錛夌墿浠朵腑涓嶅儏鍎插瓨涓€紼瀷鎱嬬殑鐗╀歡錛屽鏋滄兂瑕佸皪閫欎簺鐗╀歡浣滃嚭涓€浜涘€嬪垾鍖栫殑鎿嶄綔錛岄瑕佹浠跺氨鏄鐭ラ亾瑭茬墿浠剁殑鍨嬫厠錛屼嬌鐢?instanceof 浼間箮鏄€嬩笉閷殑鏂瑰紡錛屽湪紼嬪紡綈″柈鐨勬儏娉佷笅錛屼篃璦辨偍鏈冮€欓杭浣滐細
 public class ElementA {
    // some implementing
 }
 
 public class ElementB {
    // some implementing
 }

 public class ElementC {
    // some implementing
 }

 // ......

    Iterator iterator = arrayList.iterator()
    while (iterator.hasNext()) {
        if (o instanceof ElementA)
銆€銆€ 銆€銆€   (ElementA) o.operationA();
        else if (o instanceof ElementB)
銆€銆€ 銆€     (ElementB) o.operationB();
銆€銆€    else if (o instanceof ElementC)
銆€銆€ 銆€     (ElementC) o.operationC();
銆€銆€    else
銆€銆€ 銆€     System.out.println(
                  "Sorry! I don't know who you are! "
                   + o.toString());
        //....
    }

    //....
 
閫欓杭浣滀甫涓嶆槸涓嶅彲浠ワ紝鍙槸灝囦締鐨勬摯鍏呮€т笉澶э紝濡傛灉浠婂ぉ鎮ㄦ兂瑕佷竴嬈℃敼璁婂皪姣忎竴紼鍨嬬墿浠剁殑鎿嶄綔錛屾偍蹇呴爤淇敼寰堝鍦版柟銆?br>
寰炵墿浠惰嚜韜殑瑙掑害渚嗘兂濂戒簡錛岀墿浠跺湪涓€鍊嬪€嬬殑鎴垮瓙涓紝鐗╀歡瑾細銆屼笉瑕佸湪鎴垮瓙澶栬不鐩″績鎬濆垽鏂蜂簡錛屽嵆鐒舵偍涓嶇煡閬撴垜鏄錛岄偅楹兼偍灝遍€蹭締璦晱鎴戝ソ浜嗭紝鎴戝憡璦存偍鎴戞槸瑾幫紝閫欓杭涓€渚嗘偍灝辯煡閬撳浣曟搷浣滄垜浜嗭紒銆?br>
鐢ㄧ▼寮忎締瀵︾従涓婇潰閫欏€嬫弿榪幫細
  • IElement.java
public interface IElement { 
public void accept(IVisitor visitor);
}

  • ElementA.java
public class ElementA implements IElement { 
public void accept(IVisitor visitor) {
visitor.visit(this);
}

public void operationA() {
System.out.println(
"do A's job....such-and-such....");
}
}

  • ElementB.java
public class ElementB implements IElement { 
public void accept(IVisitor visitor) {
visitor.visit(this);
}

public void operationB() {
System.out.println(
"do B's job....such-and-such....");
}
}

  • ElementC.java
public class ElementC implements IElement { 
public void accept(IVisitor visitor) {
visitor.visit(this);
}

public void operationC() {
System.out.println(
"do C's job....such-and-such....");
}
}

  • IVisitor.java
public interface IVisitor { 
public void visit(ElementA element);
public void visit(ElementB element);
public void visit(ElementC element);
}

  • VisitorA.java
public class VisitorA implements IVisitor { 
public void visit(ElementA element) {
element.operationA();
}

public void visit(ElementB element) {
element.operationB();
}

public void visit(ElementC element) {
element.operationC();
}
}

  • Main.java
public class Main { 
public static void main(String[] args) {
// know nothing about their type
// after storing them into Element array
IElement[] list = {new ElementA(),
new ElementB(),
new ElementC()};

IVisitor visitor = new VisitorA();

for (int i=0; i < list.length; i++)
list[i].accept(visitor);
}
}

Visitor璦晱鏄熀鏂紀verload渚嗗畬鎴愶紝灝嶆柤姣忎竴鍊嬪鐝綢Element鐨勭墿浠朵締瑾紝瀹冩帴鍙桰Visitor渚嗚í鍟忓畠錛屽湪accept()鏂規硶涓紝IVisitor浣跨敤姝g⒑鐨勬柟娉曚締璦晱IElement錛堥’鐒剁殑錛岄€欓杭閮ㄤ喚鍙互闈犱笉鍚岀殑鍑藉紡鍚嶇ū錛屾垨鏄痮verload渚嗛仈鎴愶級錛屼甫鍦╲isit() 涓皪IElement浣滃嚭灝嶆噳鐨勬搷浣滐紝濡傛灉鎮ㄤ粖澶╂兂瑕佹彌鎺夋瘡涓€鍊婭Element鐨勬搷浣滐紝鍙鏇存彌IVisitor欏炲瀷鐨勭墿浠跺氨鍙互浜嗭紝涔熷氨鏄€欒錛?br>
 // IVisitor visitor = new VisitorA();
 // 鎻涙帀涓€鍊婭Visitor錛屽氨鍙互鎻涙帀鎵€鏈夌殑鎿嶄綔
 // 涓嶇敤淇敼澶氬€嬪湴鏂?/span>
 IVisitor visitor = new VisitorB();
 

鑸夊€嬪闅涚殑渚嬪瓙錛屽亣璦璙isitorA鍙槸鍊嬫嚩鎯扮殑鎺ㄩ姺鍝″ソ浜嗭紝浠婂ぉ鏈変竴鍊嬫瘮杓冨嫟蹇殑鎺ㄩ姺鍝isitorB錛屽湪璦晱閬嶪Element涔嬪緦錛屾渻灝?IElement浣滃嚭鏇村鐨勬搷浣滐紝瑕佸湪紼嬪紡涓鐝綱isitorB錛屽彧瑕佸鍔犱竴鍊媀isitorB欏炲垾灝卞彲浠ヤ簡錛?br>
  • VisitorB.java
public class VisitorB implements IVisitor { 
public void visit(ElementA element) {
System.out.println("VisitorB is a hard worker....");
element.operationA();
System.out.println(
"I want to do some extra work on A....");
}

public void visit(ElementB element) {
System.out.println("VisitorB is a hard worker....");
element.operationB();
System.out.println(
"I want to do some extra work on B....");
}

public void visit(ElementC element) {
System.out.println("VisitorB is a hard worker....");
element.operationC();
System.out.println(
"I want to do some extra work on C....");
}
}

鏀逛竴涓婱ain渚嗙ず綃勶細
  • Main.java
public class Main { 
public static void main(String[] args) {
IElement[] list = {new ElementA(),
new ElementB(),
new ElementC()};

System.out.println("visitorA is coming.......");
IVisitor visitorA = new VisitorA();
for (int i=0; i < list.length; i++)
list[i].accept(visitorA);

System.out.println("\nvisitorB is coming.......");
IVisitor visitorB = new VisitorB();
for (int i=0; i < list.length; i++)
list[i].accept(visitorB);
}
}

鍦ㄧ瘎渚嬩腑鐨凷ystem.out.println();鍙槸鍊嬬ず鎰忥紝瀹冧篃鍙兘鏄偍灝岻Element鐨勯澶栨柟娉曠殑鐩存帴瑾跨敤銆?

Visitor妯″紡鐨?UML 緄愭欏炲湒濡備笅錛?br>
Visitor

鍦?a >Java World涓湁涓€綃囨枃绔狅紝鎻愬埌鍙互鍒╃敤reflection渚嗘敼閫蹭嬌鐢ㄨí鍟忚€呮ā寮忔檪鐨勫綀鎬э紝鏈夎垐瓚g殑鍙互閫蹭竴姝ュ弮鑰冧竴涓?a >Reflect on the Visitor design pattern銆?br>

]]>
Design Pattern: Strategy 妯″紡http://www.aygfsteel.com/jesson2005/articles/111191.html寮犻噾楣?/dc:creator>寮犻噾楣?/author>Tue, 17 Apr 2007 02:52:00 GMThttp://www.aygfsteel.com/jesson2005/articles/111191.htmlhttp://www.aygfsteel.com/jesson2005/comments/111191.htmlhttp://www.aygfsteel.com/jesson2005/articles/111191.html#Feedback0http://www.aygfsteel.com/jesson2005/comments/commentRss/111191.htmlhttp://www.aygfsteel.com/jesson2005/services/trackbacks/111191.html
public void replace() {
   switch(getChangeType()) {
      case RN_TYPE:   replaceRN();
                          break;
      case N_TYPE: replaceN();
                          break;
      case OTHER_TYPE: replaceOTHER():
                          break;
      ...
   }
}
 
閫欓杭浣滅殑緙洪粸鏄紝鏃ュ緦鎮ㄨ澧炲姞鏇存彌絎﹁櫉鐨勭瓥鐣ユ檪錛屾渻鏈夊咕鍊嬪湴鏂歸渶瑕佷慨鏀癸細澧炲姞TYPE甯告暩銆佸鍔燭extCharChange涓殑 replaceXXX()鏂規硶銆佸鍔?replace()鏂規硶涓殑switch case鍒ゆ柗銆?br>
鍍忛€欑ó絳栫暐鎺$敤鐨勬儏娉侊紝鍙互灝囩瓥鐣ュ姞浠ュ皝瑁濈偤涓€鍊嬬墿浠訛紝鑰屼笉鏄皣絳栫暐瀵鍦ㄦ煇鍊嬮涓紝濡傛涓€渚嗭紝絳栫暐鍙互鐛ㄧ珛鏂煎鎴剁錛岄毃鏅傚鍔犺畩鍖栥€佸鍔犳垨娓涘皯絳栫暐錛屽嵆浣挎槸淇敼姣忓€嬬瓥鐣ョ殑鍏у錛屼篃涓嶆渻灝嶅鎴剁紼嬪紡閫犳垚褰遍熆銆?br>
渚嗚垑鍊嬫渶綈″柈鐨勪緥瀛愶紝棣栧厛瑕佺煡閬揥indows鑸嘗inux鐨勬枃瀛楁獢妗堟彌琛岀铏熸槸涓嶅悓鐨勶紝Windows鏄?/r/n 錛岃€孡inux鏄?/n錛屼粖澶╂偍瑕佽ō璦堜竴鍊嬫枃瀛楃法杓櫒錛屽湪閬╃暥鐨勬檪鍊欙紝鎮ㄥ繀闋堣鑳介毃鏅傝綁鎻涢€欏叐紼铏燂紝濡傛灉涓嶆帯鐢ㄤ笂闈㈢殑絳栫暐鎺$敤嫻佺▼鐨勮┍錛岃濡備綍璦▓錛?br>
  • TextStrategy.java
public abstract class TextStrategy { 
protected String text;

public TextStrategy(String text) {
this.text = text;
}

public abstract String replace();
}

  • LinuxStrategy.java
public class LinuxStrategy extends TextStrategy { 
public LinuxStrategy(String text) {
super(text);
}

public String replace() {
preOperation();
System.out.println(
text = text.replaceAll("@r@n", "@n"));
postOperation();

return text;
}

private void preOperation() {
System.out.println("LinuxStrategy preOperation");
}

private void postOperation() {
System.out.println("LinuxStrategy postOperation");
}
}

  • WindowsStrategy.java
public class WindowsStrategy extends TextStrategy { 
public WindowsStrategy(String text) {
super(text);
}

public String replace() {
startOperation();
System.out.println(
text = text.replaceAll("@n", "@r@n"));
endOperation();

return text;
}

private void startOperation() {
System.out.println("WindowsStrategy startOperation");
}

private void endOperation() {
System.out.println("WindowsStrategy endOperation");
}
}

  • TextCharChange.java
public class TextCharChange { 
public static void replace(TextStrategy strategy) {
strategy.replace();
}
}

  • Main.java
public class Main { 
public static void main(String[] args) {
String linuxText =
"This is a test text!!@n Oh! Line Return!!@n";
String windowsText =
"This is a test text!!@r@n Oh! Line Return@r@n";

// load file, suppose it's Linux's text file
// take the WindowsStrategy
// I want to change it to Windows' text file
TextCharChange.replace(
new WindowsStrategy(linuxText));

// such-and-such operation.....
System.out.println();

// load file, suppose it's Windows' text file
// take the LinuxStrategy
// I want to change it to Linux's text file
TextCharChange.replace(
new LinuxStrategy(windowsText));
}
}

鐐轟簡鏄庨’鐨勭鍑虹祼鏋滐紝鎴戝€戜嬌鐢ˊn渚嗚〃紺?'/n' 錛?@r 琛ㄧず '/r' 絎﹁櫉錛孧ain涓殑嫻佺▼鏄€嬪亣璦殑鎯呮硜錛屼綍鏅傛帯鐢ㄤ綍紼瓥鐣ユ槸闅ㄦ鐨勩€?br>
鍦⊿trategy妯″紡涓紝浣跨敤涓€鍊嬪叕闁嬬殑浠嬮潰replace()錛岃畵瀹㈡埗绔珛姹傦紝鑰屽湪瀵︿綔replace()鏅傦紝鍙互浠繪剰鐨勭祫鍚堟紨綆楃瓥鐣ワ紝紼嬪紡涓殑 preOperation()銆乸ostOperation()灝辨槸鐢ㄤ互紺烘剰婕旂畻鐨勭祫鍚堟蹇碉紝Strategy妯″紡灝佽浜嗛€欎簺婕旂畻閬庣▼錛屼嬌瀹冨€戞槗鏂肩祫鍚堛€佷慨鏀廣€佹浛鎻涳紝涓婇潰閫欏€嬩緥瀛愮殑UML 欏炲垾緄愭鍦栧涓嬫墍紺猴細
Strategy

Strategy妯″紡鐨刄ML欏炲垾緄愭鍦栧涓嬶細
Strategy
寰炶鐐轟笂渚嗚錛?a >State 妯″紡 鑸嘢trategy妯″紡鏄牷鐩歌繎鐨勩€?br>
State妯″紡錛氱湅鐣跺墠鏄粈楹肩媭鎱嬶紝灝辨帯鍙栦粈楹煎嫊浣溿€?br>
Strategy妯″紡錛氱湅闇€姹傦紙鎯呭錛夋槸浠€楹鹼紝鎺$敤閬╃暥鐨勭瓥鐣ャ€?br>
涓嶉亷鍏╄€呴洊鐩鎬技錛屾噳鐢ㄧ殑鍫村悎紼嶆湁涓嶅悓錛孲tate妯″紡涓湁涓€鍊嬮噸榛炲湪鏂艱ō瀹氱媭鎱嬭畩鍖栵紝灝卞儚 Gof 渚嬪瓙涓垑鐨凾CP閫g窔錛汼trategy絳栫暐妯″紡鍓囨槸鐩存帴鎺$敤閬╃暥鐨勭瓥鐣ョ殑鎰熻錛屼緥濡侴of涓鐨勶紝鎺$敤閬╃暥鐨勬紨綆楁硶渚嗕綔姝f枃鎻涜銆?br>

]]>
Design Pattern: Template Method 妯″紡http://www.aygfsteel.com/jesson2005/articles/111192.html寮犻噾楣?/dc:creator>寮犻噾楣?/author>Tue, 17 Apr 2007 02:52:00 GMThttp://www.aygfsteel.com/jesson2005/articles/111192.htmlhttp://www.aygfsteel.com/jesson2005/comments/111192.htmlhttp://www.aygfsteel.com/jesson2005/articles/111192.html#Feedback0http://www.aygfsteel.com/jesson2005/comments/commentRss/111192.htmlhttp://www.aygfsteel.com/jesson2005/services/trackbacks/111192.html
Template Method妯″紡灝辨槸涓€鍊嬪緢綈″柈鐨勬ā寮忥紝浣嗗彲鑳芥槸浣跨敤鏈€寤f硾鐨勬ā寮忥紝涔熻ū鎮ㄤ篃涓€鐩村湪浣跨敤閫欐ǎ鐨勬ā寮忥紝鐪嬪畠鐨?UML 欏炲垾緄愭鍦栧氨鐭ラ亾浜嗭細
TemplateMethod

鍍呭儏鏄娊璞¢鍒ヨ垏鍏烽珨欏炲垾瀵︿綔鐨勯棞淇傝€屽凡錛屾湁浜涗漢甯稿晱鎶借薄欏炲垾鑸囦粙闈㈢殑鍗€鍒ョ偤浣曪紝Template Method妯″紡鍙互鎻愪緵鍏朵腑涓€鍊嬬瓟妗堬紝渚嬪錛?br>
  • AbstractClass.java
public abstract class AbstractClass { 
public void templateMethod() {
// step by step template to solve something
// implementor should follow those step
opStep1();
opStep2();
opStep3();
}

public abstract void opStep1();
public abstract void opStep2();
public abstract void opStep3();
}

  • ConcreteClass.java
public class ConcreteClass extends AbstractClass { 
public abstract void opStep1() {
// implement the real operation
}

public abstract void opStep2() {
// implement the real operation
}

public abstract void opStep3() {
// implement the real operation
}
}

灝嶆柤涓€浜涚▼寮忚€岃█錛屾垜鍊戝笇鏈涜瀹氫竴浜涜檿鐞嗙殑姝ラ銆佹祦紼嬫垨楠ㄦ灦錛屽氨鍍忔槸涓婁緥涓殑step1鍒皊tep3涓€妯o紝鑷蟲柤嫻佺▼涓殑step1鍒皊tep3濡備綍瀵︿綔涓︿笉瑕忓畾錛岃€岀暀緄﹀浣滅殑浜鴻嚜琛屾焙瀹氾紝閫欏氨鏄疶emplate Method妯″紡鐨勭洰鐨勩€?br>
鎶借薄欏炲垾鑸囦粙闈㈢殑宸垾涔嬩竴錛屼篃姝e湪鏂兼娊璞¢鍒ュ彲浠ュ厛瀵︿綔鍏朵腑涓€浜涙柟娉曪紝鑰屼粙闈㈠墖鏄畬鍏ㄥ儏瑕忓畾鎺ュ彛錛屼嬌鐢═emplate Method妯″紡灝卞彲浠ョ湅鍑哄叐鑰呬箣闁撳湪鎳夌敤涓婄殑涓€鍊嬪樊鍒ャ€?br>
鍍呬互step1鍒皊tep3閫欐ǎ鐨勬搷浣滀締鐪婽emplate Method妯″紡錛屼技涔庡槳欏ず涓嶅嚭鍏跺浣滈鏋訛紝鑰屽皣瀵︿綔閮ㄤ喚鐣欏緟瀛愰鐨勫鐢ㄦ€э紝鍦?Gof 鏇鎬腑鎵€鑸夌殑渚嬪瓙鏄垏 Factory Method 妯″紡緄愬悎鐨勪竴鍊嬩緥瀛愶紱閫氬父闁嬪暉涓€鍊嬫獢妗堢殑嫻佺▼鏄浉浼肩殑錛屼緥濡傛枃瀛楁獢鎴栦簩閫蹭綅妾旓紝涓嶅涔庢鏌ユ獢妗堟槸鍚﹀彲闁嬪暉銆佽畝鍙栨獢妗堛€佽ō瀹氶’紺虹瓑嫻佺▼錛屽彲浠ヤ嬌鐢?Template Method妯″紡渚嗚綃勯€欏€嬫祦紼嬶細 
 public abstract class Application {
    // .....

    public void openDocument(String name) {
        // Template Method
        if(!canOpenDocument(name)) { // unable to open file
            // show error message, throw exception
            return;
        }

        Document doc = createDocument(); // Factory Method

        if(doc != null) {
            _docs.addDocument(doc);
            // Template Method
            aboutToOpenDocument(doc);
             doc.open();
             doc.doRead();
        }
    }

    // Factory Method
    public abstract Document createDocument();

    // Template Method
    public abstract boolean canOpenDocument(String name);
    public abstract void aboutToOpenDocument(Document doc);
 }
 
 public class MyApplication extends Application {
    // implement Factory Method
    public void Document createDocument() {
        return new MyDocument();
    }

    // implement Template Method
    public void boolean canOpenDocument(String name) {
        // implemented code here
    }

    public void aboutToOpenDocument(Document doc) {
        // implemented code here
    }
 }
 
Factyro Method妯″紡灝囧闅涜鍓靛緩鐨勭墿浠舵帹閬茶嚦瀛愰涓焙瀹氾紝鑰?Template Method妯″紡鍓囨槸灝囨祦紼嬫鏋剁殑瀵︿綔鐣欏緟瀛愰渚嗚В姹猴紝浜嬪涓婂湪閫欏€嬩緥瀛愪腑錛屾偍涔熷彲浠ュ皣createDocument()鐪嬩綔鏄疶emplate Method妯″紡涓殑涓€鍊嬫柟娉曪紝寰炵墿浠跺壍寤虹殑瑙掑害渚嗙湅瀹冩槸Factory Method錛岃€屽緸嫻佺▼妗嗘灦鐨勮搴︿締鐪嬶紝瀹冨墖鏄疶emplate Method妯″紡鐨勪竴鍊嬫柟娉曞浣溿€?br>

]]>
Design Pattern: Memento 妯″紡http://www.aygfsteel.com/jesson2005/articles/111187.html寮犻噾楣?/dc:creator>寮犻噾楣?/author>Tue, 17 Apr 2007 02:50:00 GMThttp://www.aygfsteel.com/jesson2005/articles/111187.htmlhttp://www.aygfsteel.com/jesson2005/comments/111187.htmlhttp://www.aygfsteel.com/jesson2005/articles/111187.html#Feedback0http://www.aygfsteel.com/jesson2005/comments/commentRss/111187.htmlhttp://www.aygfsteel.com/jesson2005/services/trackbacks/111187.html
鑸囧叾鍦ㄧ墿浠跺収寤虹珛寰╁師姍熷埗錛屼笉濡傚皣寰╁師姍熷埗寰炵墿浠朵腑鑴洟鍑轟締錛岄€欏€嬫檪鍊欐偍鍙互浣跨敤Memento妯″紡渚嗛仈鎴愰€欏€嬪姛鑳姐€?br>
Memento妯″紡鍦∣riginator涓繚鐣欎竴鍊婱emento鎴愬摗錛岄€欏€婱emento鍙互鍖呮嫭Originator鐨勬垚鍝¤硣璦婏紝鍦ㄥ閮ㄧ殑瑭憋紝 Memento鍙互鐢變竴鍊婥aretaker綞錛屾瘡灝峅riginator浣滀竴鍊嬪嫊浣滐紝Caretaker灝變繚鐣橭riginator鍕曚綔鍓嶇殑鎴愬摗鐙€鎱嬶紝濡傛灉浠ュ緦瑕佸京鍘熺墿浠剁媭鎱嬶紝鍙寰濩aretaker鍙栧洖Memento鐗╀歡錛屽皪Originator閫茶鐙€鎱嬪京鍘熴€?br>
Memento妯″紡鐨?UML 欏炲垾緄愭鍦栧涓嬫墍紺猴細
Memento

鍦栦腑鐨凜aretaker鏄敤渚嗕繚鐣欏師鐧艱€呮墍鍓甸€犵殑鍌欏繕閷勭墿浠訛紝浠ヤ緵鏃ュ緦寰╁師鏅傚彇鍥烇紝state琛ㄧず涓€鍊嬪収閮ㄧ媭鎱嬶紝鍏ч儴鐙€鎱嬪鏅傦紝涔熷彲浠ュ皣涔嬬祫綣旂偤涓€鍊嬮鍒ワ紝Caretaker綞鐨凪emento鍙互鏄鍊嬶紝鐢ㄤ締瀵︾従Redo鑸嘦ndo澶氭鐨勫姛鑳姐€?br>
涓嬮潰鎻愪緵涓€鍊嬬啊鍠殑瀵︿綔錛岀湅鐪嬪浣曞鐝綧emento妯″紡錛?br>
  • Originator.java
public class Originator { 
private String name;
private String phone;

public Originator(String name, String phone) {
this.name = name;
this.phone = phone;
}

// Some operations make state changed
public void someOperation() {
name = "noboby";
phone = "911-911";
}

// recover object's state
public void setMemento(Memento m) {
this.name = m.getName();
this.phone = m.getPhone();
}

public Memento createMemento() {
return new Memento(name, phone);
}

public void showInfo() {
System.out.println("Name: " + name +
"\nPhone: " + phone + "\n");
}
}

  • Memento.java
public class Memento { 
private String name;
private String phone;

public Memento(String name, String phone) {
this.name = name;
this.phone = phone;
}

public String getName() {
return name;
}

public String getPhone() {
return phone;
}

public void setName(String name) {
this.name = name;
}

public void setPhone(String phone) {
this.phone = phone;
}
}

  • Caretaker.java
public class Caretaker { 
private Memento memento;

public void setMemento(Memento memento) {
this.memento = memento;
}

public Memento getMemento() {
return memento;
}
}
\
  • Main.java
public class Main { 
public static void main(String[] args) {
Originator originator =
new Originator("Justin", "888-8888");
Caretaker caretaker = new Caretaker();

// save object's memento
caretaker.setMemento(originator.createMemento());

originator.showInfo();
// some operations make the object's state changed
originator.someOperation();
originator.showInfo();

// use memento to recover object's state
originator.setMemento(caretaker.getMemento());
originator.showInfo();
}
}

鍙互緄愬悎 Command 妯″紡 渚嗗浣淩edo/Undo鐨勫姛鑳斤紝灝囨搷浣滃墠寰岀殑鐗╀歡鐙€鎱嬭閷勪笅渚嗭紝涓﹁閷勬墍浣跨敤鐨勫懡浠わ紝鐣惰瀵︾従Undo/Redo鏅傦紝鍙鍙栧洖Memento鐗╀歡浠ュ京鍘熺墿浠剁媭鎱嬪嵆鍙€?br>


]]>
Design Pattern: Observer 妯″紡http://www.aygfsteel.com/jesson2005/articles/111189.html寮犻噾楣?/dc:creator>寮犻噾楣?/author>Tue, 17 Apr 2007 02:50:00 GMThttp://www.aygfsteel.com/jesson2005/articles/111189.htmlhttp://www.aygfsteel.com/jesson2005/comments/111189.htmlhttp://www.aygfsteel.com/jesson2005/articles/111189.html#Feedback0http://www.aygfsteel.com/jesson2005/comments/commentRss/111189.htmlhttp://www.aygfsteel.com/jesson2005/services/trackbacks/111189.html 涓婚 璩囨枡鐗╀歡 瑙€瀵熻€?/strong> 鏌辯媭鍦栧艦 琛ㄦ牸鍦栧艦 鍦撻鍦栧艦

鍙堝亣璦偍浠婂ぉ璦▓涓€鍊嬬恫璺亰鎴詫紝鎮ㄥ湪浼烘湇鍣ㄤ笂綞涓€鍊嬮€g窔瀹㈡埗绔叡浜殑璩囨枡鐗╀歡錛岀暥鍏朵腑涓€鍊嬪鎴剁浣滀簡鎿嶄綔錛屽皣灝嶆璩囨枡鐗╀歡浣滀慨鏀癸紝鍓囦己鏈嶅櫒蹇呴爤閫氱煡鍏跺畠瀹㈡埗绔綔鐩稿皪鎳夌殑璁婂寲錛堝儚鏄漢鐗╀綅緗蛋鍕曘€佸緩浜嗕竴鍊嬪煄鍫$瓑錛夈€?
涓婚 璩囨枡鐗╀歡
瑙€瀵熻€?/strong> 瀹㈡埗绔竴 瀹㈡埗绔簩 瀹㈡埗绔笁


鍦∣bserver妯″紡涓殑涓昏鐐轟富欏岋紙subject錛夎垏瑙€瀵熻€咃紙observer錛夛紝瑙€瀵熻€呰▊闁卞畠鎰熻垐瓚g殑涓婚錛屼竴鍊嬩富欏屽彲浠ヨ澶氬€嬭瀵熻€呰▊闁憋紝鐣朵富欏岀殑鐙€鎱嬬櫦鐢熻畩鍖栨檪錛屽畠蹇呴爤閫氱煡錛坣otify錛夋墍鏈夎▊闁卞畠鐨勮瀵熻€咃紝瑙€瀵熻€呮瑕栦富欏岀殑鐙€鎱嬭畩鍖栵紝涓︿綔鍑哄皪鎳夌殑鍕曚綔錛屾墍浠bserver 妯″紡涔熺ū涔嬬偤Publish-Subscribe妯″紡銆?

Observer妯″紡鐨?UML 鍦栧涓嬫墍紺猴細
Observer

Subject欏炰腑鏈変竴鍊媙otify()鏂規硶錛岄€氬父鏄湪Subject鐨勭媭鎱嬬櫦鐢熸敼璁婃檪鍛煎彨瀹冿紝notify()涓渻鍛煎彨 Observer鐨剈pdate()鏂規硶錛岄€氬父鏈冨厛鍙栧緱Subject鐨勬柊鐙€鎱嬶紝鐒跺緦鏇存柊Observer鐨勯’紺烘垨琛岀偤錛岄€欏€嬮亷紼嬫垜鍊戝彲浠ラ€忛亷 Sequence Diagram渚嗚〃閬旓細
Observer

鍦↗ava涓敮鎻磋瀵熻€呮ā寮忥紝瑕佹垚鐐鴻瀵熻€呯殑欏炲繀闋堝浣淥bserver浠嬮潰錛岄€欏€嬩粙闈腑瀹氱京浜嗕竴鍊媢pdate()鏂規硶錛岄€欏€嬫柟娉曟渻琚富欏岀墿浠跺湪閫氱煡鐙€鎱嬭畩鍖栨檪鍛煎彨錛屾偍蹇呴爤鍦ㄩ€欏€嬫柟娉曚腑瀵︿綔鎮ㄦ墍鎯寵鐨勫皪鎳夎鐐恒€?br>
涓婚鐗╀歡鏈冩槸Observable鐨勫瓙欏烇紝鍦ㄩ€欓倞娉ㄦ剰鍏╁€嬮噸瑕佺殑鏂規硶錛歴etChanged()鑸噉otifyObserver()銆?setChanged()鏄敤渚嗚ō瀹氫富欏岀墿浠剁殑鐙€鎱嬪凡綞撹鏀硅畩錛岃€宯otifyObserver()鏂規硶鏈冮€氱煡鎵€瑕佽▊闁變富欏岀墿浠剁殑瑙€瀵熻€咃紝瑾跨敤鍏?update()鏂規硶銆?br>
鏈夎垐瓚g殑瑭憋紝寤鴻鐪嬩竴涓婮ava鐨凮bservable.java涓槸濡備綍瀵︿綔鐨勶紝閫欐湁鍔╂柤鐬ВObserver妯″紡鐨勯亱浣滄柟寮忋€?

]]>
Design Pattern: State 妯″紡http://www.aygfsteel.com/jesson2005/articles/111190.html寮犻噾楣?/dc:creator>寮犻噾楣?/author>Tue, 17 Apr 2007 02:50:00 GMThttp://www.aygfsteel.com/jesson2005/articles/111190.htmlhttp://www.aygfsteel.com/jesson2005/comments/111190.htmlhttp://www.aygfsteel.com/jesson2005/articles/111190.html#Feedback0http://www.aygfsteel.com/jesson2005/comments/commentRss/111190.htmlhttp://www.aygfsteel.com/jesson2005/services/trackbacks/111190.htmlGof 鐨勬浉浠嬬垂State妯″紡鏅傦紝澶ф鏈冪湅寰椾竴闋湩姘村惂錛乀CP鐨勯€g窔鐙€鎱嬪湒錛屽厜鏄鐬В灝辮鑺遍粸綺劇浜嗭紝瀹冪殑閫g窔鐙€鎱嬪緢澶氾紝鐢ㄤ締瑾槑鐙€鎱嬫ā寮忕⒑瀵﹀緢閬╁悎錛屼絾涓嶉仼鍚堟暀灝庡垵瀛告ā寮忕殑浜恒€?

鐢辯啊鍠殑闁嬪鏈冩瘮杓冨ソ鐞嗚В鐙€鎱嬫ā寮忕殑浣滅敤錛屽厛渚嗙湅涓€鍊嬩緥瀛愶紝濡傛灉鎮ㄦ湁涓€鍊嬪彧鑳介爢鏅傞嚌杞夊嫊鐨勭摝鏂枊闂滐紝杞夊嫊涓€嬈$殑鐙€鎱嬬偤off銆?small fire銆乵edium fire鑸噇arge fire錛屾偍濡備綍鍦ㄧ▼寮忎腑鎺у埗鐙€鎱嬬殑璁婂寲鑸囪鐐哄憿錛熶竴鍊嬫渶綈″柈鐨勬柟寮忓氨鏄敤if..else鎴栨槸switch嫻佺▼渚嗘帶鍒訛紝渚嬪錛?br>
  • State.java
public class State { 
private int state;

public State() {
state = 0;
}

public void switchFire() {
if (state == 0) {
state = 1;
System.out.println( "small fire" );
} else if (state == 1) {
state = 2;
System.out.println( "medium fire" );
} else if (state == 2) {
state = 3;
System.out.println( "large fire" );
} else {
state = 0;
System.out.println( "turning off" );
}
}
}

  • Main.java
public class Main { 
public static void main(String[] args) {
State state = new State();

state.switchFire();
state.switchFire();
state.switchFire();
state.switchFire();
}
}

閫欏€嬫柟娉曞緢綈″柈錛屾瘡鍊嬩漢閮芥渻錛屼絾濡傛灉鎮ㄧ殑鐙€鎱嬭畩鍖栦甫涓嶆槸嫻佹按寮忕殑璁婂寲錛岃€屾槸鍍廡CP閫g窔鐙€鎱嬩竴妯o紝鏈冩槸涓€鍊嬬恫緄″湒鐨勬檪鍊欙紝鐢?if...else鎴杝witch渚嗗鐨勮┍錛屾偍鐨勭▼寮忓氨鏈冧簜鐨勪笉鍍忚┍浜嗭紱渚嗚€冩叜濡備綍璁撶墿浠舵帶鍒惰嚜宸辯殑鐙€鎱嬭綁鎻涜垏鎵€鎳夎〃鐝劇殑琛岀偤錛岄€欏€嬬▼寮忓彲浠ラ€欐ǎ鏀瑰錛?br>
  • IState.java
public interface IState { 
public void switchFire(FireSwitch sw);
}

  • OffState
public class OffState implements IState { 
public void switchFire(FireSwitch sw) {
sw.setState(new SmallState());
System.out.println( "small fire" );
}
}

  • SmallState.java
public class SmallState implements IState { 
public void switchFire(FireSwitch sw) {
sw.setState(new MediumState());
System.out.println( "medium fire" );
}
}

  • MediumState.java
public class MediumState implements IState { 
public void switchFire(FireSwitch sw) {
sw.setState(new LargeState());
System.out.println( "large fire" );
}
}

  • LargeState.java
public class LargeState implements IState { 
public void switchFire(FireSwitch sw) {
sw.setState(new OffState());
System.out.println( "off fire" );
}
}

  • FireSwitch.java
public class FireSwitch { 
private State current;

public FireSwitch() {
current = new OffState();
}

public void setState(State s) {
current = s;
}

public void switchFire() {
current.switchFire(this);
}
}

  • Main.java
public class Main { 
public static void main(String[] args) {
FireSwitch fireSwitch = new FireSwitch();
fireSwitch.switchFire();
fireSwitch.switchFire();
fireSwitch.switchFire();
fireSwitch.switchFire();
}
}

紼嬪紡鍩瘋緄愭灉鑸囦笂涓€鍊嬩緥瀛愭槸涓€妯g殑錛屼絾閫欐涓︽矑鏈夌敤嫻佺▼鎺у埗渚嗛€茶鐙€鎱嬭綁鎻涳紝鑰岀敱鐗╀歡鑷鎺у埗鑷繁鐨勭媭鎱嬶紝鑸囧繀闋堣〃鐝劇殑琛岀偤錛岄€欏€嬫柟寮忓氨鏄疭tate 妯″紡錛屽皣閫欏€嬩緥瀛愮殑 UML 欏炲垾緄愭鐣嚭灝卞涓嬫墍紺猴細
State

鍐嶉€蹭竴姝ヨ€冩叜闁嬮棞鍙互闋嗘檪閲濊垏閫嗘檪閲濊綁鍕曪紝閫欐檪濡傛灉鎮ㄤ粛浠f...else鎴杝witch渚嗗錛屽氨鏈冭畵嫻佺▼欏ず瑜囬洔錛屼締鐪嬬湅濡備綍浣跨敤鐙€鎱嬫ā寮忎締鎾板錛?
  • IState.java
public interface IState { 
public void switchClockWise(FireSwitch sw);
public void switchCountClock(FireSwitch sw);
}

  • OffState.java
public class OffState implements IState { 
public void switchClockWise(FireSwitch sw) {
sw.setState(new SmallState());
System.out.println("small fire");
}

public void switchCountClock(FireSwitch sw) {
sw.setState(new LargeState());
System.out.println("large fire");
}
}

  • SmallState.java
public class SmallState implements IState { 
public void switchClockWise(FireSwitch sw) {
sw.setState(new MediumState());
System.out.println("medium fire");
}

public void switchCountClock(FireSwitch sw) {
sw.setState(new OffState());
System.out.println("off fire");
}
}

  • MediumState.java
public class MediumState implements IState { 
public void switchClockWise(FireSwitch sw) {
sw.setState(new LargeState());
System.out.println("large fire");
}

public void switchCountClock(FireSwitch sw) {
sw.setState(new SmallState());
System.out.println("small fire");
}
}

  • LargeState.java
public class LargeState implements State { 
public void switchClockWise(FireSwitch sw) {
sw.setState(new OffState());
System.out.println("off fire");
}

public void switchCountClock(FireSwitch sw) {
sw.setState(new MediumState());
System.out.println("medium fire");
}
}

  • FireSwitch.java
public class FireSwitch { 
private State current;

public FireSwitch() {
current = new OffState();
}

public void setState(State s) {
current = s;
}

public void switchClockWise() {
current.switchClockWise(this);
}

public void switchCountClock() {
current.switchCountClock(this);
}
}

  • Main.java
public class Main { 
public static void main(String[] args) {
FireSwitch fireSwitch = new FireSwitch();

fireSwitch.switchClockWise();
fireSwitch.switchClockWise();
fireSwitch.switchClockWise();
fireSwitch.switchClockWise();

System.out.println();

fireSwitch.switchCountClock();
fireSwitch.switchCountClock();
fireSwitch.switchCountClock();
fireSwitch.switchCountClock();
}
}

鎺ヤ笅渚嗘偍鍙互浠繪剰鐨勮綁鍕曢枊闂滀簡錛岀劇璜栨槸闋嗘檪閲濊綁鍕曟垨鏄€嗘檪閲濊綁鍕曪紝鐙€鎱嬬殑杞夋彌閮界敱鐗╀歡鑷繁渚嗚〃鐝撅紝閫欐槸闆欏悜鐙€鎱嬭綁鎻涗笅鐨勪緥瀛愶紝濡傛灉涓€鍊嬬媭鎱嬪彲鑳借綁鎻涜嚦涓夊€嬩互涓婄殑鐙€鎱嬶紝浣跨敤State妯″紡灝辨洿鍙互鐪嬪嚭瀹冪殑濂借檿浜嗭紝灝卞儚Gof鐨凾CP閫g窔渚嬪瓙涓€妯o紝濡傛灉鎮ㄧ灜瑙CP閫g窔錛屽彲浠ョ湅鐪嬪師鏇告槸濡備綍瀵︾従TCP閫g窔涔嬮枔鐨勭媭鎱嬭綁鎻涚殑銆?

State妯″紡鐨刄ML緄愭鍦栧涓嬶細
State


]]>
Design Pattern: Mediator 妯″紡http://www.aygfsteel.com/jesson2005/articles/111186.html寮犻噾楣?/dc:creator>寮犻噾楣?/author>Tue, 17 Apr 2007 02:48:00 GMThttp://www.aygfsteel.com/jesson2005/articles/111186.htmlhttp://www.aygfsteel.com/jesson2005/comments/111186.htmlhttp://www.aygfsteel.com/jesson2005/articles/111186.html#Feedback0http://www.aygfsteel.com/jesson2005/comments/commentRss/111186.htmlhttp://www.aygfsteel.com/jesson2005/services/trackbacks/111186.html
鐗╀歡灝庡悜璦▓涓紝姣忓€嬬墿浠舵墍璨犳摂鐨勫伐浣滃剺鍙兘鐨勭啊鍠槑鐬紝榧撳嫷鐗╀歡灝囧伐浣滃垎甯冭嚦鍏跺畠鐗╀歡涓婏紝璁撲竴緹ゅ伐浣滃爆鎬х浉鍚岀殑鐗╀歡寰椾互鍏卞悓鍚堜綔錛屽嵆鎵€瓔傞珮鑱氬悎鎬э紝浠ュ鍔犵墿浠剁殑鍙噸鐢ㄦ€с€?br>
鐒惰€屽湪緄勭箶鐗╀歡宸ヤ綔鐨勫悓鏅傦紝鐗╀歡褰兼涔嬮枔鍙兘鐭ラ亾褰兼鐨勫瓨鍦紝涓︾浉浜掍緷璩達紝閫欏氨浣垮緱鐗╀歡涔嬮枔鐨勮€﹀悎鎬х浉灝嶇殑鎻愰珮錛屾渶宸殑鎯呮硜涓嬶紝鎵€鏈夌殑鐗╀歡閮界煡閬撳郊姝ょ殑瀛樺湪錛岄€欏張鏈冧嬌寰楃郴緄辯殑閲嶇敤鎬ч檷浣庛€?br>
Mediator妯″紡鐢ㄤ竴鍊嬩腑浠嬬殑鐗╀歡渚嗗皝瑁濈墿浠跺郊姝や箣闁撶殑浜や簰錛岀墿浠朵箣闁撲甫涓嶇敤浜掔浉鐭ラ亾鍙︿竴鏂癸紝閫欏彲浠ラ檷浣庣墿浠朵箣闁撶殑鑰﹀悎鎬э紝濡傛灉瑕佹敼璁婄墿浠朵箣闁撶殑浜や簰琛岀偤錛屼篃鍙渶瑕佸皪Mediator鍔犱互淇敼鍗沖彲銆?br>
鍦?Gof 鐨勬浉 涓墍鑸夌殑渚嬪瓙鐐哄皪瑭辨柟濉婄祫浠訛紱渚嬪錛岀暥涓€鍊嬬壒瀹氱殑杓稿叆嬈勭偤絀烘檪錛屽彟涓€鍊嬫寜閳曚笉鑳戒嬌鐢紱鍦↙istBox鐨勯伕闋呬腑閬告搰涓€鍊嬮爡鐩紝灝囨渻鏀硅畩鍙︿竴鍊嬫瑒浣嶇殑鍏у錛涘弽閬庝締鐨勶紝杓稿叆嬈勪綅鐨勫収瀹逛篃鏈冨獎闊縇istBox鐨勯伕鎿囩瓑絳夈€?
Mediator

鍦ㄩ€欏€嬩緥瀛愪腑錛屽彲浠ヨō璦堝皪瑭辨柟濉婁腑鐨勭祫浠剁煡閬撳郊姝ょ殑瀛樺湪錛岀敱涓€鍊嬬洿鎺ュ獎闊垮彟涓€鍊嬶紙鎴栧鍊嬶級緄勪歡錛屼絾鏈€濂界殑鏂規硶錛岄倓鏄ō璦堜竴鍊婱ediator錛岀敱瀹冧締鍗旇緄勪歡涔嬮枔鐨勪氦浜掞紝渚嬪璦▓涓€鍊婩ontDialogDirector欏炲垾渚嗕綔鐐轟腑浠嬭€呫€?
Mediator

鍙互寰濻equence Diagram渚嗙灜瑙ediator鐨勯亱浣滐細
Mediator

鐣禠istBox鐧肩敓璁婂寲鏅傦紝瀹冩渻鍛煎彨Mediator鐨刲istBoxChanged()鏂規硶錛孧ediator鍙栧緱璁婂寲鐨勭祫浠朵箣鐙€鎱嬶紝涓﹂噸鏂拌ō瀹氭墍鏈夎垏瀹冩湁浜や簰鐨勭祫浠訛紝鍚屾ǎ鐨勶紝鍏跺畠鐨勭祫浠剁櫦鐢熻畩鍖栨檪錛屼篃鍛煎彨Mediator涓婂皪鎳夌殑鏂規硶錛岀敱Mediator渚嗗彇寰楃祫浠惰畩鍖栵紝涓﹁ō瀹氬叾瀹冧簰鍕曠殑緄勪歡銆?br>
綈″柈鐨勮錛孧ediator璦▓鏈夎垏緄勪歡婧濋€氱殑浠嬮潰錛屼粙闈腑灝佽浜嗚垏鍏跺畠緄勪歡浜掑嫊绱扮瘈錛岀祫浠惰垏緄勪歡涔嬮枔涓嶇敤鐭ラ亾褰兼鐨勫瓨鍦紝瀹冨€戝彧瑕佽垏Mediator婧濋€氬氨濂戒簡錛屽埄鐢ㄩ€欑ó鏂瑰紡錛屽彲浠ュ垏闁嬬祫浠惰垏緄勪歡涔嬮枔鐨勮€﹀悎銆?br>
Mediator妯″紡鐨?UML 緄愭鍦栧涓嬫墍紺猴細
Mediator
鍩烘湰涓奙ediator妯″紡鍦ㄤ嬌鐢ㄧ殑褰堟€у緢澶э紝鐢盨equence Diagram鐞嗚В姒傚康錛屾渻姣斿緸Class Diagram鐬В緄愭渚嗗緱閲嶈錛屼笉閬庡湪Class Diagram涓彲浠ユ敞鎰忕殑鏄鍒ョ殑鍚嶇ū錛孋olleague鏄悓浜嬬殑鎰忔€濓紝灝囦竴緹ゅ叡浜嬬殑鍏冧歡瑕栫偤涓€緹ゅ叡鍚屽悎浣滅殑鍚屼簨錛岀偤浜嗕嬌鍚屼簨涔嬮枔鐨勬椿鍕曠崹绔嬶紝涓︿嬌寰楀湗闅婂悎浣滅殑浜や簰鏇村叿褰堟€э紝闇€瑕佷竴鍊婱ediator渚嗗崝瑾垮悓浜嬩箣闁撶殑妤嫏琛岀偤銆?

]]>
Design Pattern: Interpreter 妯″紡http://www.aygfsteel.com/jesson2005/articles/111184.html寮犻噾楣?/dc:creator>寮犻噾楣?/author>Tue, 17 Apr 2007 02:47:00 GMThttp://www.aygfsteel.com/jesson2005/articles/111184.htmlhttp://www.aygfsteel.com/jesson2005/comments/111184.htmlhttp://www.aygfsteel.com/jesson2005/articles/111184.html#Feedback0http://www.aygfsteel.com/jesson2005/comments/commentRss/111184.htmlhttp://www.aygfsteel.com/jesson2005/services/trackbacks/111184.html
鑸夊€嬩緥瀛愪締瑾槑濂戒簡錛屽厛瑾槑鐨勬槸錛岄€欏€嬩緥瀛愭槸鏀瑰鑷?Design Patterns鏂糐ava瑾炶█涔嬪緲掓噳鐢?/a> 絎?3绔犵殑綃勪緥錛屾垜灝囦箣鏇寸啊鍖栦簡錛屼互璁撳ぇ瀹跺皣鐒﹂粸鑳介泦涓湪濡備綍浣跨敤Interpreter妯″紡錛屼互鍙婂浣曞鐢ㄣ€?br>
鍋囪ō鎮ㄨ瀵︿綔涓€鍊婭nterpreter錛岄€欏€婭nterpreter鍙互鐩磋鎮ㄦ枃瀛楁獢涓殑紼嬪紡錛屼甫渚濇偍鑷▊鐨勭▼寮忔枃娉曚締鍩瘋紼嬪紡錛屽咕鍊嬬啊鍠殑紼嬪紡濡備笅錛?br>
PROGRAM
    PRINT dog SPACE
    PRINT is SPACE
    PRINT an SPACE
    PRINT animai
END
 
鎮ㄧ殑閫欏紡紼嬪€嬫渻鍗板嚭"dog is an animal"鐨勬枃瀛楋紝鍐嶄締涓€鍊嬩緥瀛愭槸錛?br>
PROGRAM
    REPEAT 2
        LINEBREAK
        PRINT dog
        BREAK
    END
END
 

閫欏€嬬▼寮忚鍗板嚭錛?br>
------------------------------
 dog
------------------------------
 dog

鎮ㄤ篃鍙互浠繪剰鐨勭祫鍚堢▼寮忥紝渚嬪錛?br>
PROGRAM
    PRINT begin
    BREAK
    REPEAT 3
        REPEAT 2
            PRINT dog SPACE
            PRINT is SPACE
            PRINT a SPACE
            PRINT animal
            BREAK
        END
    END
END
 

閫欏€嬬▼寮忎腑鐨勫咕鍊嬮棞閸靛瓧鏄疨ROGRAM銆丳RINT銆丼PACE銆丅REAK銆丩INEBREAK銆丷EPEAT銆丒ND錛?PROGRAM鏄〃紺虹▼寮忛枊濮嬶紝浠ND浣滅祼錛孭RINT鍙互鍗板嚭涓€鍊嬬劇絀虹櫧鐨勫瓧涓詫紝SPACE鍗板嚭涓€鍊嬬┖鐧斤紝BREAK鏄彌琛岋紝鑰孡INEBREAK鏄暙涓€鍊嬬洿綬氫甫鎻涜錛孯EPEAT鏄看鍦堟寚浠わ紝鍙互鎸囧畾榪村湀嬈℃暩錛屼互END浣滅祼銆?br>
瑙€瀵熺▼寮忥紝鍙互鍒跺畾鍑轟互涓嬬殑鏂囨硶錛屽涓嬶細
<program> ::= PROGRAM <command list>
<command list> ::= <command>* END
<command> ::= <repeat command> | <primitive command>
<repeat command> ::= REPEAT <number> <command list>
<primitive command> ::= PRINT <string>
                         | BREAK | SPACE | LINEBREAK
 

紼嬪紡鏂囨硶鍒跺畾闇€瑕佸皪紼嬪紡閫茶瑾炲彞鍒嗘瀽鑸囧畾緹╋紝鍦ㄩ€欓倞涓︿笉璦庤珫閫欏€嬭欏岋紝鍦ㄧ▼寮忎腑錛宑ommand綃€榛炵敱primitive鎴杛epeat鍏╁€嬬瘈榛炰換鎰忕祫鍚堬紝涓€鍊媍ommand list綃€榛炲墖鏄浂鍊嬩互涓婄殑command綃€榛炵祫鍚堣€屾垚錛屽叾涓璻epeat閭勫彲浠ョ祫鍚坈ommand list綃€榛烇紝閫欐槸緄勫悎妯″紡鐨勬噳鐢紝鍙互鍦ㄧ▼寮忎腑緄勫悎宸㈢媭榪村湀銆?br>
鍦ㄧ洿璀▼寮忔檪錛屼互璁€鍒癙ROGRAM浣滅偤闁嬪綃€榛烇紝鎺ヤ笅渚嗘垜鍊戝墫鏋愮▼寮忕偤command list 綃€榛烇紝涓﹀皣瀹冨€戜笩緄﹀皥闁€鍓栨瀽command list鐨勭墿浠剁辜綰屽墫鏋愶紝閫欏€嬬墿浠跺皣涔嬪垎鏋愶紝鐪嬫槸涓嶆槸鏈塺epeat command鎴杙rimitive command綃€榛烇紝濡傛灉鏈夊氨鍐嶅線涓嬩氦鐢卞皥灞墿浠墮€茶鍓栨瀽錛屽姝ゅ堡灞ゅ墲闁嬶紝涓︾敱灝堝爆鐗╀歡璨犺鉑鍓栨瀽宸ヤ綔銆?br>
Interpreter妯″紡鐨勫熀鏈蹇靛氨濡備笂鎵€紺猴紝鍏堜締鐪嬬湅濡備綍浠ョ▼寮忓鐝懼墫鏋愮殑閬庣▼錛屼笅闈㈤€欏€嬬▼寮忔渻鍓栨瀽鎮ㄧ殑紼嬪紡錛屼甫灝囩▼寮忓姞涓婂皪鎳夌殑鎷櫉渚嗗皣鍚屼竴鍊嬪崁濉婄祫鍚堣搗渚嗭紝浠ヨ〃紺哄畠瀹屾垚鍓栨瀽涔嬪緦鐨勭祼鏋滐細
  • INode.java
public interface INode { 
public void parse(Context context);
}

  • ProgramNode.java
// <program> ::= PROGRAM <command list> 
public class ProgramNode implements INode {
private INode commandListNode;
public void parse(Context context) {
context.skipToken("PROGRAM");
commandListNode = new CommandListNode();
commandListNode.parse(context);
}

public String toString() {
return "[PROGRAM " + commandListNode + "]";
}
}

  • CommandListNode.java
import java.util.Vector; 

// <command list> ::= <command>* END
public class CommandListNode implements INode {
private Vector list = new Vector();

public void parse(Context context) {
while (true) {
if (context.currentToken() == null) {
System.err.println("Missing 'END'");
break;
} else if (
context.currentToken().equals("END")) {
context.skipToken("END");
break;
} else {
INode commandNode = new CommandNode();
commandNode.parse(context);
list.add(commandNode);
}
}
}

public String toString() {
return "" + list;
}
}

  • CommandNode.java
// <command> ::= <repeat command> | <primitive command> 
public class CommandNode implements INode {
private INode node;

public void parse(Context context) {
if (context.currentToken().equals("REPEAT")) {
node = new RepeatCommandNode();
node.parse(context);
} else {
node = new PrimitiveCommandNode();
node.parse(context);
}
}

public String toString() {
return node.toString();
}
}

  • RepeatCommandNode.java
public class RepeatCommandNode implements INode { 
private int number;
private INode commandListNode;

public void parse(Context context) {
context.skipToken("REPEAT");
number = context.currentNumber();
context.nextToken();
commandListNode = new CommandListNode();
commandListNode.parse(context);
}

public String toString() {
return "[REPEAT " + number + " "
+ commandListNode + "]";
}
}

  • PrimitiveCommandNode.java
// <primitive command> ::= PRINT <string> 
// | SPACE | BREAK | LINEBREAK
public class PrimitiveCommandNode implements INode {
private String name;
private String text;

public void parse(Context context) {
name = context.currentToken();
context.skipToken(name);
if (!name.equals("PRINT") && !name.equals("BREAK")
&& !name.equals("LINEBREAK")
&& !name.equals("SPACE")) {
System.err.println("Undefined Command");
}

if (name.equals("PRINT")) {
text = context.currentToken();
name += text;
context.nextToken();
}
}

public String toString() {
return name;
}
}

  • Context.java
import java.util.*; 

public class Context {
private StringTokenizer tokenizer;
private String currentToken;

public Context(String text) {
tokenizer = new StringTokenizer(text);
nextToken();
}

public String nextToken() {
if (tokenizer.hasMoreTokens()) {
currentToken = tokenizer.nextToken();
} else {
currentToken = null;
}
return currentToken;
}

public String currentToken() {
return currentToken;
}

public void skipToken(String token) {
if (!token.equals(currentToken)) {
System.err.println("Warning: " + token +
" is expected, but " +
currentToken + " is found.");
}
nextToken();
}

public int currentNumber() {
int number = 0;
try {
number = Integer.parseInt(currentToken);
} catch (NumberFormatException e) {
System.err.println("Warning: " + e);
}
return number;
}
}

  • Main.java
import java.util.*; 
import java.io.*;

public class Main {
public static void main(String[] args) {
try {
BufferedReader reader = new
BufferedReader(new FileReader(args[0]));
String text;
while ((text = reader.readLine()) != null) {
System.out.println("text = \"" +
text + "\"");
INode node = new ProgramNode();
node.parse(new Context(text));
System.out.println("node = " + node);
}
}
catch (ArrayIndexOutOfBoundsException e) {
System.err.println(
"Usage: java Main yourprogram.txt");
}
catch (Exception e) {
e.printStackTrace();
}
}
}

鍋囪ō鎮ㄧ殑紼嬪紡鏄€欐ǎ瀵殑錛?br>
  • program.txt
PROGRAM PRINT xxx END
PROGRAM REPEAT 4 PRINT xxx END END
PROGRAM REPEAT 4 PRINT xxx PRINT "yyy" END END

鍓囧煼琛孖ntrepreter紼嬪紡涔嬪緦鏈冩槸錛?br>
 $ java Main program.txt
 text = "PROGRAM PRINT xxx END"
 node = [PROGRAM [PRINTxxx]]

 text = "PROGRAM REPEAT 4 PRINT xxx END END"
 node = [PROGRAM [[REPEAT 4 [PRINTxxx]]]]

 text = "PROGRAM REPEAT 4 PRINT xxx PRINT "yyy" END END"
 node = [PROGRAM [[REPEAT 4 [PRINTxxx, PRINT"yyy"]]]]

閫欏€嬬瘎渚嬬▼寮忓熀鏈笂宸茬稉欏ず浜嗙洿璀櫒妯″紡鐨勫伐浣滃師鐞嗭紝濡備綍璁撶▼寮忕洿璀箣寰岃兘澶犲伐浣滐紝閫欏緟鏈冨啀紺虹瘎錛屽厛渚嗙湅涓€涓婭ntrepreter妯″紡鐨?UML 欏炲垾緄愭鍦栵細
Intrepreter

TerminalExpression灝卞儚鎴戝€戠殑primitive command錛屽啀鍓栨瀽涓嬪幓宸茬稉娌掓湁瀛愮瘈榛炰簡錛岃€孨onterminalExpression灝卞儚鏄痳epeat command錛屾敞鎰忓埌鍏朵腑涔熶嬌鐢ㄤ簡緄勫悎妯″紡錛屽氨濡備箣鍓嶆墍瑾殑錛岀祫鍚堟ā寮忚畵鍙互閬炶看鐨勭祫鍚堝彞瀛愮偤鏇磋闆滅殑瑾炲彞銆?br>
鎮ㄥ凡綞撴渻鍓栨瀽鍙ュ瓙浜嗭紝鎺ヤ笅渚嗚濡備綍璁撻€欏€嬬洿璀櫒鐪熸宸ヤ綔錛岄洊鐒剁▼寮忎腑浣跨敤toString()渚嗚〃紺烘瘡涓€鍊嬬瘈榛炵殑鍓栨瀽緄愭灉錛屼絾浜嬪涓婏紝閫欏€嬬▼寮忎篃宸茬稉瑾槑浜嗗浣曡畵鍓栨瀽鐨勭祼鏋滅湡姝i亱浣滀簡錛屾棦鐒跺凡綞撹閷勫ソ鍓栨瀽涔嬪緦鐨勮獮鍙ラ爢搴忎簡錛屽彧瑕佺敱涓婅€屼笅榪借工鍓栨瀽緄愭灉錛屽氨涓€瀹氬彲浠ュ煼琛屽埌 primitive command錛屼笖闋嗗簭絎﹀悎鑷▊鐨勭▼寮忓師濮嬬⒓鐨勯渶姹傦紝閫欏彧瑕佸皣toString()鏀圭偤execute()錛屼甫浣滀竴浜涜綁鐧艱垏閲嶈鍩瘋鐨勪慨鏀瑰氨鍙互浜嗭紝鐩存帴渚嗙湅紼嬪紡鏈冩瘮杓冨鏄撶悊瑙o細
  • INode.java
public interface INode {
public void parse(Context context);
public void execute();
}

  • ProgramNode.java
// <program> ::= PROGRAM <command list>
public class ProgramNode implements INode {
private INode commandListNode;

public void parse(Context context) {
context.skipToken("PROGRAM");
commandListNode = new CommandListNode();
commandListNode.parse(context);
}

public void execute() {
commandListNode.execute();
}

public String toString() {
return "[PROGRAM " + commandListNode + "]";
}
}

  • CommandListNode.java
import java.util.*;    

// <command list> ::= <command>* END
public class CommandListNode implements INode {
private Vector list = new Vector();
private INode commandNode;

public void parse(Context context) {
while (true) {
if (context.currentToken() == null) {
System.err.println("Missing 'END'");
break;
} else if(context.currentToken().equals("END")) {
context.skipToken("END");
break;
} else {
commandNode = new CommandNode();
commandNode.parse(context);
list.add(commandNode);
}
}
}

public void execute() {
Iterator it = list.iterator();
while (it.hasNext()) {
((CommandNode)it.next()).execute();
}
}

public String toString() {
return "" + list;
}
}

  • CommandNode.java
// <command> ::= <repeat command> | <primitive command>
public class CommandNode implements INode {
private INode node;

public void parse(Context context) {
if (context.currentToken().equals("REPEAT")) {
node = new RepeatCommandNode();
node.parse(context);
} else {
node = new PrimitiveCommandNode();
node.parse(context);
}
}

public void execute() {
node.execute();
}

public String toString() {
return node.toString();
}
}

  • PrimitiveCommandNode.java
// <primitive command> ::= PRINT <string> 
// | SPACE | BREAK | LINEBREAK
public class PrimitiveCommandNode implements INode {
private String name;
private String text;

public void parse(Context context) {
name = context.currentToken();
context.skipToken(name);
if (!name.equals("PRINT") && !name.equals("BREAK")
&& !name.equals("LINEBREAK")
&& !name.equals("SPACE")) {
System.err.println("Undefined Command");
}

if (name.equals("PRINT")) {
text = context.currentToken();
context.nextToken();
}
}

public void execute() {
if(name.equals("PRINT"))
System.out.print(text);
else if(name.equals("SPACE"))
System.out.print(" ");
else if(name.equals("BREAK"))
System.out.println();
else if(name.equals("LINEBREAK"))
System.out.println(
"\n------------------------------");
}

public String toString() {
return name;
}
}

  • RepeatCommandNode.java
public class RepeatCommandNode implements INode {
private int number;
private INode commandListNode;

public void parse(Context context) {
context.skipToken("REPEAT");
number = context.currentNumber();
context.nextToken();
commandListNode = new CommandListNode();
commandListNode.parse(context);
}

public void execute() {
for(int i = 0; i < number; i++)
commandListNode.execute();
}

public String toString() {
return "[REPEAT " + number + " " +
commandListNode + "]";
}
}

  • Context.java
import java.util.*;

public class Context {
private StringTokenizer tokenizer;
private String currentToken;

public Context(String text) {
tokenizer = new StringTokenizer(text);
nextToken();
}

public String nextToken() {
if (tokenizer.hasMoreTokens()) {
currentToken = tokenizer.nextToken();
} else {
currentToken = null;
}
return currentToken;
}

public String currentToken() {
return currentToken;
}

public void skipToken(String token) {
if (!token.equals(currentToken)) {
System.err.println("Warning: " + token +
" is expected, but " +
currentToken + " is found.");
}
nextToken();
}

public int currentNumber() {
int number = 0;
try {
number = Integer.parseInt(currentToken);
} catch (NumberFormatException e) {
System.err.println("Warning: " + e);
}
return number;
}
}

  • Main.java
import java.util.*;
import java.io.*;

public class Main {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(
new FileReader(args[0]));
String text;
while ((text = reader.readLine()) != null) {
System.out.println("text = \"" + text
+ "\"");
INode node = new ProgramNode();
node.parse(new Context(text));
node.execute();
}
}
catch (ArrayIndexOutOfBoundsException e) {
System.err.println(
"Useage: java Main yourprogram.txt");
}
catch (Exception e) {
e.printStackTrace();
}
}
}

鍋囪ō鎮ㄧ殑鐩磋紼嬪紡紼挎槸閫欓杭鎾板鐨勶細
  • program.txt
PROGRAM REPEAT 4 LINEBREAK PRINT justin SPACE PRINT momor LINEBREAK END END

鍓囩▼寮忓煼琛岀殑緄愭灉灝辨槸錛?
  $ java Main program.txt
 text = "PROGRAM REPEAT 4 LINEBREAK PRINT justin SPACE
         PRINT momor LINEBREAK END END"
 ------------------------------
 justin momor
 ------------------------------

 ------------------------------
 justin momor
 ------------------------------

 ------------------------------
 justin momor
 ------------------------------

 ------------------------------
 justin momor
 ------------------------------ 

Design Patterns鏂糐ava瑾炶█涔嬪緲掓噳鐢?/a> 絎?3绔犵殑綃勪緥涓紝鍙互璁撴偍渚濇寚浠ょǹ鐩磋錛岀暙鍑轟換浣曠殑鍦栨錛岃畵綃勪緥緄愬悎浜嗗伐寤狅紙Factory錛夋ā寮忋€佸瑙€錛團acade錛夋ā寮忕瓑絳夛紝鍦ㄩ€欓倞寤鴻鎮ㄧ湅鐪嬮偅鍊嬬瘎渚嬶紝鐪嬬湅涓嶅悓鐨勮ō璦堟ā寮忎箣闁撳浣曠祫鍚堜笖鐩鎬簰鍚堜綔銆?br>

]]>
Design Pattern: Iterator 妯″紡http://www.aygfsteel.com/jesson2005/articles/111185.html寮犻噾楣?/dc:creator>寮犻噾楣?/author>Tue, 17 Apr 2007 02:47:00 GMThttp://www.aygfsteel.com/jesson2005/articles/111185.htmlhttp://www.aygfsteel.com/jesson2005/comments/111185.htmlhttp://www.aygfsteel.com/jesson2005/articles/111185.html#Feedback0http://www.aygfsteel.com/jesson2005/comments/commentRss/111185.htmlhttp://www.aygfsteel.com/jesson2005/services/trackbacks/111185.html
  • Main.java
import java.util.*;

public class Main {
public static void main(String[] args) {
List arrayList = new ArrayList();

for(int i = 0; i < 10; i++)
arrayList.add("Test " + i);

for(int i = 0; i < 10; i++)
System.out.println(arrayList.get(i).toString());
}
}

鍦ㄩ€欏€嬩緥瀛愪腑錛屽緢騫擱亱鐨勶紝鎮ㄧ殑ArrayList鐗╀歡鍙互閫忛亷get()鏂規硶錛屼嬌鐢ㄧ儲寮曞姞涓婅看鍦堢殑鏂瑰紡渚嗗驚搴忚í鍟?ArrayList涓殑鎵€鏈夌墿浠訛紝涓嶉亷涓︿笉鏄瘡涓€鍊嬭仛鍚堬紙aggregate錛夌墿浠剁殑鍏ч儴瀵︿綔閮芥渻鏄湁绱㈠紩緄愭鐨勶紝涔熻ū鏄痥ey/value鐨勬柟寮忥紝鎴栬€呮槸鍏跺畠鐨勬柟寮忋€?br>鐢辨柤姣忓€嬭仛鍚堢墿浠剁殑鍏ч儴瀵︿綔鏂瑰紡涓嶇洝鐩稿悓錛屽鏋滄偍鎯寵寰簭鐨勮í鍟忚仛鍚堢墿浠朵腑鎵€鏈夌殑鐗╀歡錛屾偍瑕佺偤涓嶅悓鐨勮仛鍚堢墿浠惰ō璦堜笉鍚岀殑寰簭璦晱浠嬮潰錛岀劧鑰岄€欎甫涓嶆槸鍊嬪ソ鏂規硶錛岀祼鏋滄槸鎮ㄨō璦堢殑鑱氬悎鐗╀歡涓婂皣鏈冩湁寰堝鐨勫驚搴忚í鍟忔柟娉曪紝鑰屼嬌鐢ㄦ偍鐨勮仛鍚堢墿浠剁殑浜猴紝閭勫繀闋堢煡閬撻€欏€嬭仛鍚堢墿浠剁殑欏炲瀷錛屾墠鑳介€蹭竴姝ョ煡閬撳浣曚嬌鐢ㄥ畠鎵€鎻愪緵鐨勬柟娉曘€?br>
鑸囧叾鍦ㄨ仛鍚堢墿浠朵笂鐩存帴璦▓閬嶈í鐨勪粙闈紝涓嶅璦▓涓€鍊嬩粙闈terator錛屼笂闈㈣ō璦堟湁緄變竴鐨勫驚搴忚í鍟忥紝鐣舵偍鎯寵寰簭璦晱鑱氬悎鐗╀歡涓殑鐗╀歡鏅傦紝灝囪仛鍚堢墿浠朵腑鐨勭墿浠跺姞浠ュ寘瑁濈偤涓€鍊婭terator寰岃繑鍥烇紝瀹㈡埗绔彧瑕侀潰灝岻terator鎵€鎻愪緵鐨勪粙闈紝鑰屼笉鐢ㄩ潰灝嶇偤鏁哥溇澶氱殑鑱氬悎鐗╀歡銆?br>
鎺″彇榪唬鍣紙Iterator錛夌殑鏂規硶錛屼竴鍊嬭凱浠e櫒鎻愪緵涓€鍊嬬壒瀹氱殑閬嶈í鏂規硶錛岃€屼嬌寰楄ō璦堜漢鍝$劇闇€闂滃績鑱氬悎鐗╀歡鐨勯鍨嬶紙鍙兘鏄疉rrayList鎴?LinkedList絳夛級錛屼緥濡備笂闈㈤€欏€嬬▼寮忓彲浠ユ敼鐐猴細
  • Main.java
import java.util.*;

public class Main {
public static void main(String[] args) {
List arrayList = new ArrayList();
for(int i = 0; i < 10; i++)
arrayList.add("Test " +i);
visit(arrayList.iterator());
}

public static visit(Iterator iterator) {
while(iterator.hasNext())
System.out.println(iterator.next().toString());
}
}

濡備笂鎵€紺虹殑錛宨terator()鏂規硶鏈冨偝鍥炰竴鍊婭terator鐗╀歡錛岄€欏€嬬墿浠舵彁渚涚殑寰簭璦晱鐨勭當涓€浠嬮潰錛屽鏋滄偍鏌ヨ Java API涓殑LinkedList鎵€鎻愪緵鐨勬柟娉曪紝鎮ㄦ渻鐧肩従瀹冪殑iterator()鏂規硶鍚屾ǎ涔熷偝鍥濱terator鐗╀歡錛屾偍鐒¢渶闂滃績鎮ㄦ墍浣跨敤鐨勬槸 ArrayList鎴朙inkedList錛屼嬌鐢↖terator鍙互璁撴偍浠ョ浉鍚岀殑鏂規硶渚嗛亶璦仛鍚堢墿浠剁殑鍏у錛屼互涓婁緥渚嗚錛寁isit()鏂規硶灝卞彲浠ラ噸鐢紝瀹冧笉鐗瑰湴鏈嶅嫏鏂糀rrayList鎴朙inkedList銆?br>
Iterator

鎰忛€欏€嬫ā鍨嬫槸綈″寲閬庡緦鐨勭増鏈紝涓︿笉鏄疛ava涓殑璦▓錛岄€欓杭浣滃彧鏄偤浜嗘柟渚胯鏄庯紝閫欏€嬪湒褰㈣鏄庝簡Iterator妯″紡鐨勫熀鏈祼妲嬨€傚啀渚嗙湅鍙︿竴鍊嬪湪 Thinking in Java鐨勪緥瀛愶紝鍙互瑾槑浣跨敤Iterator鐨勫ソ铏曪細
  • HamsterMaze.java
import java.util.*; 

class Hamster {
private int hamsterNumber;
Hamster(int i) { hamsterNumber = i; }
public String toString() {
return "This is Hamster #" + hamsterNumber;
}
}

class Printer {
static void printAll(Iterator e) {
while(e.hasNext()) {
System.out.println(e.next());
}
}
}

public class HamsterMaze {
public static void main(String[] args) {
ArrayList v = new ArrayList();
for(int i = 0; i < 3; i++) {
v.add(new Hamster(i));
}
Printer.printAll(v.iterator());
}
}

灝嶆柤Printer鐗╀歡渚嗚錛屽畠瀹屽叏涓嶇敤鐭ラ亾鑱氬悎鐗╀歡鐨勯鍨嬪埌搴曟槸ArrayList鎴栨槸LinkedList錛屾偍鍙鍌沖洖Iterator鐗╀歡灝卞彲浠ヤ簡錛屽墿涓嬬殑灝辨槸浣跨敤Iterator鐗╀歡鎵€鎻愪緵鐨勫驚搴忚í鍟忔柟娉曚締璦晱鎵€鏈夌殑鐗╀歡銆?

Iterator妯″紡鐨?UML 緄愭鍦栧涓嬫墍紺猴細
Iterator

浣跨敤Iterator妯″紡錛屽彲浠ュ皣寰簭璦晱鑱氬悎灝嶈薄鐨勬柟娉曞緸瑭插皪璞′腑鍒嗛洟鍑轟締錛屽緸鑰屼嬌寰楄仛鍚堝皪璞$殑璦▓鍠磾鍖栵紝灝嶅鎴朵締瑾紝浠栨墍瑕佺煡閬撶殑鏄墍浣跨敤鐨?Iterator鑰屼笉鏄仛鍚堝皪璞$殑欏炲瀷銆?br>

]]>
Design Pattern: Command 妯″紡http://www.aygfsteel.com/jesson2005/articles/111182.html寮犻噾楣?/dc:creator>寮犻噾楣?/author>Tue, 17 Apr 2007 02:46:00 GMThttp://www.aygfsteel.com/jesson2005/articles/111182.htmlhttp://www.aygfsteel.com/jesson2005/comments/111182.htmlhttp://www.aygfsteel.com/jesson2005/articles/111182.html#Feedback0http://www.aygfsteel.com/jesson2005/comments/commentRss/111182.htmlhttp://www.aygfsteel.com/jesson2005/services/trackbacks/111182.html
鍦ㄨō璦圫wing鏅傦紝璦▓浜哄摗鏄笉鍙兘鐭ラ亾浣跨敤Swing欏炲垾鐨勪漢錛屽湪鏌愬€嬩簨浠剁櫦鐢熷緦鎵€瑕佸煼琛岀殑鍕曚綔鏄粈楹肩殑錛屼粬鍊戞帯鐢ㄤ簡Command妯″紡錛屼互涓婇潰鐨勯渶姹備綔鐐轟緥瀛愶紝涓€鍊嬪浣滅殑鐗囨鍙兘鍍忔槸閫欏€嬫ǎ瀛愶細
menuCut.addActionListener(
    new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // textArea 鏄?JTextArea鐨勪竴鍊嬪渚?
            textArea.cut();  
         }
    });
 
涓婇潰鍊嬮€欑墖孌墊帯鐢ㄧ殑鏄疛ava鐨勫尶鍚嶉鍒ワ紙Anonymous class錛夛紝涓€鍊嬩笉鍏峰悕鐨勯鍒ュ浣滀簡ActionListener浠嬮潰錛屽畠鍙湁涓€鍊嬫柟娉昦ctionPerformed()錛屼嬌鐢?addActionListener()鐐篔MenuItem鍔犲叆閫欏€嬮鍒ョ殑瀵︿緥錛屼竴浣嗛€欏€婮MenuItem琚寜涓嬶紝瀹冨氨鏈冭鐢?actionPerformed()鏂規硶錛屼互鍩瘋鎮ㄦ墍瀹氱京鐨勫伐浣滐紝 UML 欏炲垾鍦栧涓嬫墍紺猴細
Command
浣跨敤Command妯″紡錛屾偍鍙互鏍規摎瀵﹂殯鐨勯渶姹備締瑾跨敤鍩瘋鐨勭墿浠訛紝鑷蟲柤鍩瘋鐨勭窗綃€灝佽鍦ㄤ簨鍏堝畾緹╁ソ鐨勬柟娉曪紙渚嬪actionPerformed()鏂規硶錛屼笅闈㈠闅涙挵瀵€嬬▼寮忎綔鐐虹ず綃勶細
  • Invoker.java
import java.util.*;

public class Invoker {
private Map commands;

public Invoker() {
commands = new HashMap();
}

public void addCommand(String commName,
ICommand command) {
commands.put(commName, command);
}

public void request(String commName) {
ICommand command = (ICommand) commands.get(commName);
command.execute();
}
}

  • ICommand.java
public interface ICommand {
public void execute();
}

  • UpperCaseHello.java
public class UpperCaseHello implements ICommand {
private String name;

public UpperCaseHello(String name) {
this.name = name;
}

public void execute() {
System.out.println("HELLO, " + name.toUpperCase());
}
}

  • LowerCaseHello.java
public class LowerCaseHello implements ICommand {
private String name;

public LowerCaseHello(String name) {
this.name = name;
}

public void execute() {
System.out.println("hello, " + name.toLowerCase());
}
}

Client妯℃摤闅ㄦ鐨勮珛姹傦紝Invoker浜嬪厛涓︿笉鐭ラ亾Client鏈冪櫦鍑轟粈楹奸渶姹傦紝浣嗗畠綹芥槸鍙互鍩瘋Client鐨勮珛姹傦細
  • Client.java
public class Client {
public static void main(String[] args) {
Invoker invoker = new Invoker();
invoker.addCommand("JUSTIN",
new UpperCaseHello("Justin"));
invoker.addCommand("momor",
new LowerCaseHello("momor"));

// simulate random request
String[] req = {"JUSTIN", "momor"};
while(true) {
int i = (int) (Math.random() * 10) % 2;
invoker.request(req[i]);
}
}
}

 

鍍忎笂闈㈤€欑ó灝囪珛姹傚皝瑁濊搗渚嗙殑妯″紡錛屽氨鏄疌ommand妯″紡錛屽畠灝囪珛姹傚緦鐨勫浣滈儴浠界暀寰呬嬌鐢ㄨ€呭浣滐紝Command妯″紡鐨刄ML欏炲垾鍦栧涓嬫墍紺猴細

Command

Command妯″紡鏄€嬬浉鐣跺父瑕嬬殑妯″紡錛岄櫎浜嗗厛鍓嶈珖閬庣殑Swing瑕栫獥紼嬪紡璦▓渚嬪瓙涔嬪錛岀従鍦ㄨū澶?a >Web MVC Framework 涔熼兘鎺$敤Command妯″紡渚嗚ō璦圕ontroller錛屽湪閫欐ǎ鐨勪緥瀛愪腑錛孋ontainer灝卞ソ姣擟ommand妯″紡涓瑿lient鐨勮鑹詫紝鑰屽墠绔?Controller錛堜緥濡侸SP鎶€琛撲腑閫氬父鏈冩帯鐢ㄧ殑Dispatcher Servlet錛夊氨鐩哥暥鏂糏nvoker錛岃€孉ction鍓囩浉鐣舵柤ICommand鐨勮鑹詫紝鑷蟲柤Receiver瑙掕壊灝辨槸鎮ㄥ皝瑁濆湪Action涓煼琛岀殑鐗╀歡浜嗐€?br>

]]>
Design Pattern: Chain of Responsibility 妯″紡http://www.aygfsteel.com/jesson2005/articles/111181.html寮犻噾楣?/dc:creator>寮犻噾楣?/author>Tue, 17 Apr 2007 02:45:00 GMThttp://www.aygfsteel.com/jesson2005/articles/111181.htmlhttp://www.aygfsteel.com/jesson2005/comments/111181.htmlhttp://www.aygfsteel.com/jesson2005/articles/111181.html#Feedback0http://www.aygfsteel.com/jesson2005/comments/commentRss/111181.htmlhttp://www.aygfsteel.com/jesson2005/services/trackbacks/111181.html
if(/* 絎﹀悎璜嬫眰姊濅歡涓€ */)
    // 鍩瘋璜嬫眰涓€
else if(/* 絎﹀悎璜嬫眰姊濅歡浜?*/)
    // 鍩瘋璜嬫眰浜?
else
    // 鍩瘋闋愯ō璜嬫眰鎴栭’紺鴻▕鎭?/span>
 
閫欐槸寰炵祼妲嬪寲紼嬪紡璦▓鐨勮榛炰締鐪婥hain of Responsibility鐨勬蹇碉紝鑻ヤ嬌鐢ㄧ墿浠剁殑瑙€榛炰締鐪婥hain of Responsibility鐨勮┍錛屾湁涓€鍊嬭純浣崇殑渚嬪瓙灝辨槸Java鐨勪緥澶栬檿鐞嗘鍒訛紝鐣剁▼寮忎腑鐧肩敓渚嬪鏅傦紝涔熸瘮鏈僣atch鎵€鎹曟崏鐨勪緥澶栨槸鍚︾鍚堬紝濡傛灉絎﹀悎灝卞煼琛屾墍璦畾鐨勮檿鐞嗭紝濡傛灉閮芥矑鏈夋瘮灝嶅埌閬╃暥鐨勪緥澶栫墿浠訛紝灝辨渻灝囦緥澶栦笩鍑簍ry...catch鍗€濉婁箣澶栥€?br>
鍦?Gof 鐨勬浉 涓鄲瀹欳hain of Responsibility鐩殑鐐猴細浣垮鍊嬬墿浠墮兘鏈夋鏈冭檿鐞嗚珛姹傦紝浠ラ伩鍏嶈珛姹傜殑鐧奸€佽€呰垏鎺ユ敹鑰呬箣闁撶殑鑰﹀悎闂滀總錛屽皣閫欎簺鐗╀歡緄勫悎鐐轟竴鍊嬮張錛屼甫娌胯憲閫欏€嬮張鍌抽仦瑭茶珛姹傦紝鐩村埌鏈夌墿浠惰檿鐞嗗畠鐐烘銆?br>
鍏堢敤涓€鍊嬩緥瀛愪締瑾槑浣跨敤if...else鐨勬柟寮忎締铏曠悊璜嬫眰錛?
  • IHandler.java
public interface IHandler {
public void handle();
}

  • SymbolHandler.java
public class SymbolHandler implements IHandler { 
public void handle() {
System.out.println("Symbol has been handled");
}
}

  • CharacterHandler.java
public class CharacterHandler implements IHandler { 
public void handle() {
System.out.println("Character has been handled");
}
}

  • NumberHandler.java
public class NumberHandler implements IHandler { 
public void handle() {
System.out.println("Number has been handled");
}
}

  • Application.java
import java.io.*; 

public class Application {
public void run() throws Exception {
System.out.print("Press any key then return: ");
char c = (char) System.in.read();

IHandler handler = null;
if (Character.isLetter(c)) {
handler = new CharacterHandler();
}
else if (Character.isDigit(c)) {
handler = new NumberHandler();
}
else {
handler = new SymbolHandler();
}

handler.handle();
}

public static void main(String[] args)
throws IOException {
Application app = new Application();
app.run();
}
}

閫欐槸涓€鍊嬪緢綈″柈鐨勭▼寮忥紝鍙互鍒ゅ畾鎮ㄦ墍杓稿叆鐨勬槸鏁稿瓧銆佸瓧鍏冩垨鏄铏燂紝濡傛灉灝囦箣浠ョ墿浠剁殑鏂瑰紡渚嗙祫綣旂墿浠朵箣闁撶殑鑱瘋鉑錛屽彲浠ュ皣紼嬪紡鏀瑰濡備笅錛?br>
  • Handler.java
public class Handler { 
private Handler successor;

public void setSuccessor(Handler successor) {
this.successor = successor;
}

public Handler getSuccessor() {
return successor;
}

public void handleRequest(char c) {
if(successor != null)
successor.handleRequest(c);
}
}

  • NumberHandler.java
public class NumberHandler extends Handler { 
public void handleRequest(char c) {
if(Character.isDigit(c)) {
System.out.println("Number has been handled");
}
else {
getSuccessor().handleRequest(c);
}
}
}

  • CharacterHandler.java
public class CharacterHandler extends Handler { 
public void handleRequest(char c) {
if(Character.isLetter(c)) {
System.out.println("Character has been handled");
}
else {
getSuccessor().handleRequest(c);
}
}
}

  • SymbolHandler.java
public class SymbolHandler extends Handler { 
public void handleRequest(char c) {
System.out.println("Symbol has been handled");
}
}

  • Application.java
import java.io.*; 

public class Application {
public static void main(String[] args)
throws IOException {
Handler numberHandler = new NumberHandler();
Handler characterHandler = new CharacterHandler();
Handler symbolHandler = new SymbolHandler();

numberHandler.setSuccessor(characterHandler);
characterHandler.setSuccessor(symbolHandler);

System.out.print("Press any key then return: ");
char c = (char)System.in.read();
numberHandler.handleRequest(c);
}
}

鍦ㄧ祫綣旂墿浠朵箣闁撶殑鑱瘋鉑鏅傦紝閫氬父鏄緸绱扮矑搴﹁嚦綺楃矑搴︾殑鏂瑰紡渚嗙祫綣旓紝寰炵壒孌婂埌鎶借薄鍖栵紝灝卞儚紼嬪紡涓皣鏁稿瓧瑕栫偤瀛楀厓鐨勭壒孌婂寲錛屽瓧鍏冨張鐐虹铏熺殑鐗規畩鍖栥€?

Chain of Responsibility鐨?UML 緄愭鍦栧涓嬫墍紺猴細
Chain of Responsibility

寰炵墿浠跺煼琛岃珛姹傜殑鏅傞枔渚嗙湅錛屽叾閬嬩綔鏄緢綈″柈鐨勮伔璨偝閬炶€屽凡錛屽涓嬶細
Chain of Responsibility

浠ヤ笂鎵€鑸夌殑渚嬪瓙鍦ㄨ珛姹備笂鏄緢綈″柈鐨勶紝鍙槸姣斿皪杓稿叆鐨勫瀷鎱嬶紝鍦ㄦ洿涓€鑸殑鎯呮硜涓嬶紝鍙互灝囪珛姹傚寘瑁濈偤涓€鍊嬬墿浠訛紝涓︽彁渚沢etType()涔嬮枔鐨勬柟娉曪紝浠ヨ畵 Chain of Responsibility涓殑鐗╀歡閫茶姣斿皪錛屼緥濡傦細
  • Request.java
public class Request{ 
銆€銆€private String type;

public Request(String type) { this.type=type; }
銆€銆€public String getType() { return type; }

銆€銆€public void execute(){
// 鍩瘋璜嬫眰
銆€銆€}
}

鍦℅of鐨勬浉涓墍鑸夌殑渚嬪瓙鐐鴻紨鍔╄鏄庣郴緄憋紝鍦ㄤ竴鍊嬩粙闈腑甯屾湜浣跨敤鑰呬竴瀹氬彲浠ュ緱鍒扮浉闂滅殑瑾槑涓婚錛屽鏋滃瓙鍏冧歡鏈夎鏄庣殑瑭憋紝灝遍’紺虹浉闂滆鏄庯紝鍚﹀墖鐨勮┍灝辮綁鐧肩鄲鍖呮嫭瀹冪殑瀹瑰櫒鍏冧歡鎴栫埗鍏冧歡錛屼互淇濊瓑浣跨敤鑰呯殑杓斿姪瑾槑璜嬫眰涓€瀹氬彲浠ュ緱鍒板洖鎳夈€?br>

]]>
主站蜘蛛池模板: 珠海市| 乐都县| 沙田区| 英德市| 常德市| 霍邱县| 晋城| 旺苍县| 榆树市| 枞阳县| 盐亭县| 达日县| 元朗区| 乌兰察布市| 宣汉县| 兴仁县| 新蔡县| 仁布县| 福海县| 宕昌县| 南川市| 武隆县| 浦县| 奉新县| 海盐县| 赞皇县| 日土县| 平潭县| 林西县| 都江堰市| 湘阴县| 西和县| 蒙城县| 靖边县| 上饶市| 梁平县| 班戈县| 海淀区| 营口市| 海宁市| 万安县|