<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    細(xì)心!用心!耐心!

    吾非文人,乃市井一俗人也,讀百卷書(shū),跨江河千里,故申城一游; 一兩滴辛酸,三四年學(xué)業(yè),五六點(diǎn)粗墨,七八筆買(mǎi)賣,九十道人情。

    BlogJava 聯(lián)系 聚合 管理
      1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
    如果您不瞭解TCP的連線方式,在看 Gof 的書(shū)介紹State模式時(shí),大概會(huì)看得一頭霧水吧!TCP的連線狀態(tài)圖,光是要瞭解就要花點(diǎn)精神了,它的連線狀態(tài)很多,用來(lái)說(shuō)明狀態(tài)模式確實(shí)很適合,但不適合教導(dǎo)初學(xué)模式的人。

    由簡(jiǎn)單的開(kāi)始會(huì)比較好理解狀態(tài)模式的作用,先來(lái)看一個(gè)例子,如果您有一個(gè)只能順時(shí)針轉(zhuǎn)動(dòng)的瓦斯開(kāi)關(guān),轉(zhuǎn)動(dòng)一次的狀態(tài)為off、 small fire、medium fire與large fire,您如何在程式中控制狀態(tài)的變化與行為呢?一個(gè)最簡(jiǎn)單的方式就是用if..else或是switch流程來(lái)控制,例如:
    • 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();
    }
    }

    這個(gè)方法很簡(jiǎn)單,每個(gè)人都會(huì),但如果您的狀態(tài)變化並不是流水式的變化,而是像TCP連線狀態(tài)一樣,會(huì)是一個(gè)網(wǎng)絡(luò)圖的時(shí)候,用 if...else或switch來(lái)寫(xiě)的話,您的程式就會(huì)亂的不像話了;來(lái)考慮如何讓物件控制自己的狀態(tài)轉(zhuǎn)換與所應(yīng)表現(xiàn)的行為,這個(gè)程式可以這樣改寫(xiě):
    • 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();
    }
    }

    程式執(zhí)行結(jié)果與上一個(gè)例子是一樣的,但這次並沒(méi)有用流程控制來(lái)進(jìn)行狀態(tài)轉(zhuǎn)換,而由物件自行控制自己的狀態(tài),與必須表現(xiàn)的行為,這個(gè)方式就是State 模式,將這個(gè)例子的 UML 類別結(jié)構(gòu)畫(huà)出就如下所示:
    State

    再進(jìn)一步考慮開(kāi)關(guān)可以順時(shí)針與逆時(shí)針轉(zhuǎn)動(dòng),這時(shí)如果您仍以if...else或switch來(lái)寫(xiě),就會(huì)讓流程顯示複雜,來(lái)看看如何使用狀態(tài)模式來(lái)撰寫(xiě):
    • 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();
    }
    }

    接下來(lái)您可以任意的轉(zhuǎn)動(dòng)開(kāi)關(guān)了,無(wú)論是順時(shí)針轉(zhuǎn)動(dòng)或是逆時(shí)針轉(zhuǎn)動(dòng),狀態(tài)的轉(zhuǎn)換都由物件自己來(lái)表現(xiàn),這是雙向狀態(tài)轉(zhuǎn)換下的例子,如果一個(gè)狀態(tài)可能轉(zhuǎn)換至三個(gè)以上的狀態(tài),使用State模式就更可以看出它的好處了,就像Gof的TCP連線例子一樣,如果您瞭解TCP連線,可以看看原書(shū)是如何實(shí)現(xiàn)TCP連線之間的狀態(tài)轉(zhuǎn)換的。

    State模式的UML結(jié)構(gòu)圖如下:
    State
    posted on 2007-04-17 10:50 張金鵬 閱讀(227) 評(píng)論(0)  編輯  收藏 所屬分類: Behavioral 模式
    主站蜘蛛池模板: 国产亚洲精AA在线观看SEE| 猫咪免费观看人成网站在线| 亚洲国产aⅴ综合网| 亚洲免费网站观看视频| 免费黄网站在线观看| 看成年女人免费午夜视频| 亚洲一区二区三区不卡在线播放| 亚洲精品无码久久久久sm| 免费国产成人午夜私人影视| 青青久在线视频免费观看| 欧洲精品99毛片免费高清观看 | 黄网站色在线视频免费观看| 国产免费网站看v片在线| 一级毛片**免费看试看20分钟| 男人的天堂av亚洲一区2区| 亚洲伊人久久大香线蕉啊| 91在线亚洲精品专区| 亚洲春色在线视频| 亚洲日韩一页精品发布| 久久影视综合亚洲| JLZZJLZZ亚洲乱熟无码| 亚洲第一区精品日韩在线播放| 国产免费av片在线播放| 国产亚洲精品免费| 免费人成在线观看网站品爱网日本| 好男人看视频免费2019中文| 最新欧洲大片免费在线| 一个人免费观看www视频在线| 四虎在线成人免费网站| 亚洲毛片免费观看| 日韩免费一区二区三区在线播放| 最近免费中文字幕高清大全| 91精品免费高清在线| 中文字幕成人免费视频| 很黄很黄的网站免费的| 久九九精品免费视频| 在线免费观看污网站| 国产精品免费一级在线观看| 免费a级黄色毛片| 亚洲国产精品无码久久九九| 亚洲午夜福利精品久久|