<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      奔跑的肥豬

      導航

      狀態模式

      狀態模式,個人認為通過將對象行為包裝在不同狀態對象里面,通過控制狀態的變化來實現行為的差異。關于狀態模式的使用場景,如果一個對象在不同狀態(至少3個狀態)下有不同行為,而且還有增加狀態的趨勢,可以考慮使用狀態模式。拿電梯(來源于Java 設計模式——狀態模式)來說,眾所周知,電梯至少有四種狀態: 開門狀態,關門狀態,運行狀態,停止狀態。

      下面用一張表將狀態和對應的動作列出來:        

       

       

      對應的狀態圖:

      為了有所區別,每個狀態之間的聯系是不一樣的,如Closed狀態和其他狀態之間用虛線,而open狀態和closed狀態之前使用實線,可以看出,狀態圖和上面的表格是一致的。 下面再看看代碼實現:

      public interface IElevator {
      
          void open();
          void close();
          void run();
          void stop();
      }
       1 public class Elevator implements IElevator {
       2 
       3     @Override
       4     public void open() {
       5         System.out.println("open the elevator");
       6     }
       7 
       8     @Override
       9     public void close() {
      10         System.out.println("close the elevator");
      11     }
      12 
      13     @Override
      14     public void run() {
      15         System.out.println("run the elevator");
      16     }
      17 
      18     @Override
      19     public void stop() {
      20         System.out.println("stop the elevator");
      21     }
      22 }
      public class Context {
          /*package*/ final State openState = new OpenState(this);
          /*package*/ final State closedState = new ClosedState(this);
          /*package*/ final State runningState = new RunningState(this);
          /*package*/ final State stoppedState = new StoppedState(this);
      
          /*package*/ final IElevator elevator;
      
          private State state;
      
          public Context(IElevator elevator) {
              this.elevator = elevator;
              this.state = openState;
          }
      
          public IElevator getElevator() {
              return elevator;
          }
      
          public void setState(State state) {
              this.state = state;
          }
      
          public void open() {
              state.open();
          }
      
          public void close() {
              state.close();
          }
      
          public void run() {
              state.run();
          }
      
          public void stop() {
              state.stop();
          }
      
          public static void main(String[] param) {
              Context context = new Context(new Elevator());
              context.close();
              context.run();
              context.open();
          }
      
      }
      public abstract class State implements IElevator {
      
          protected final Context context;
      
          public State(Context context) {
              this.context = context;
          }
      
          protected void log(String state, String action) {
              System.out.println("Elevator can't take action " + action + " in state " + state);
          }
      }
      public class OpenState extends State {
      
          public OpenState(Context context) {
              super(context);
          }
      
          @Override
          public void open() {
              log("open", "open");
          }
      
          @Override
          public void close() {
              context.getElevator().close();
              context.setState(context.closedState);
          }
      
          @Override
          public void run() {
              log("open", "run");
          }
      
          @Override
          public void stop() {
              log("open", "stop");
          }
      }
      public class ClosedState extends State {
      
          public ClosedState(Context context) {
              super(context);
          }
      
          @Override
          public void open() {
              context.getElevator().open();
              context.setState(context.openState);
          }
      
          @Override
          public void close() {
              log("closed", "close");
          }
      
          @Override
          public void run() {
              context.getElevator().run();
              context.setState(context.runningState);
          }
      
          @Override
          public void stop() {
              context.getElevator().stop();
              context.setState(context.stoppedState);
          }
      }
      public class RunningState extends State {
      
          public RunningState(Context context) {
              super(context);
          }
      
          @Override
          public void open() {
              log("running", "open");
          }
      
          @Override
          public void close() {
              log("running", "close");
          }
      
          @Override
          public void run() {
              log("running", "run");
          }
      
          @Override
          public void stop() {
              context.getElevator().stop();
          }
      }
      public class StoppedState extends State {
      
          public StoppedState(Context context) {
              super(context);
          }
      
          @Override
          public void open() {
              context.getElevator().open();
              context.setState(context.openState);
          }
      
          @Override
          public void close() {
              log("stopped", "close");
          }
      
          @Override
          public void run() {
              context.getElevator().run();
              context.setState(context.runningState);
          }
      
          @Override
          public void stop() {
              log("stopped", "stop");
          }
      }

      代碼和簡單,類圖如下:

       

      現在問題來了,新聞上經常報告電梯出事,上級要求每個電梯添加急救按鈕,用戶在緊急情況下可以按下此按鈕逃生。想想看,如果之前沒有使用狀態模式,拿到這個需求程序員是不是有想死的沖動 , 而狀態模式能很好解決這個需求只需要添加urgent動作就可以了。

      如果各位還不過癮,我想再拿個打電話的小例子,狀態圖如下:

      如果手機新增一個urgent功能:

      具體代碼我就不展示了,具體代碼可以參見: https://github.com/breakJeff/designPattern,如果發現問題,請及時留言。

       

      posted on 2017-04-27 11:37  布兜兜  閱讀(173)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 亚洲成人av综合一区| 激情五月开心婷婷深爱| 青青国产揄拍视频| 亚洲国产激情一区二区三区| 少妇人妻偷人精品系列| 久久精品夜夜夜夜夜久久| 亚洲午夜久久久影院伊人| 成人无码视频| 亚洲成人av综合一区| 香港特级三A毛片免费观看| 精品国产片一区二区三区| 人妻激情偷乱视频一区二区三区 | 国产揄拍国产精品| 国产99在线 | 亚洲| 辽宁省| 精品人妻av中文字幕乱| 色悠悠久久精品综合视频 | 国产做a爱片久久毛片a片| 激情五月天一区二区三区| 蜜桃臀无码AV在线观看| 国产999久久高清免费观看 | 又大又硬又爽免费视频| 天堂av资源在线免费| 亚洲av片在线免费观看| 美女黄网站18禁免费看| 东京热一精品无码av| 精品国精品国自产在国产| 国产麻花豆剧传媒精品mv在线| 亚洲综合一区无码精品| 亚洲av色综合久久综合| 日本一区二区三区四区黄色| 99久久精品国产一区二区| 亚洲国内精品一区二区| 色色97| 好紧好湿好黄的视频| 久久人与动人物a级毛片| 国产精品久久久久久久久久直播| 妺妺窝人体色WWW看人体| 精品尤物TV福利院在线网站| 一区二区福利在线视频| 无码高潮爽到爆的喷水视频 |