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

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

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

      設計模式之狀態模式(三分鐘學會一個設計模式)

      狀態模式(State Pattern)的定義是這樣的:類的行為是基于它的狀態改變的。
      注意這里的狀態不是狹義的指對象維護了一個“狀態”字段,我們傳入了不同的枚舉值,對象整體的表現行為(對外方法)就改變了。
      而是指內部的(任意)字段如果發生了變化,那么它的狀態就變了,那么它對外的表現形式就變了。
      狀態模式是面向對象的23種設計模式中的一種,屬于行為模式的范圍。
      通常我們在解決不同狀態下,對外方法的不同表現時,可以定義若干的枚舉,然后寫一大堆if、 elseif、 switch等選擇命令來區分不同的狀態,然后走不同的業務分支。
      而狀態模式是支持將這些分支業務抽離出一個獨立類(狀態類),我們通過傳入不同的狀態類,就可以動態的執行不同的業務方法。
      整體的結構大概是這樣的:

      業務類維護了一個內部狀態對象,這個狀態對象支持由外部傳入,切換為不同的狀態對象。
      而這些狀態對象都統一實現了具體的方法,業務類內部在執行業務方法時,會調用這些狀態對象中實現的方法。(防盜連接:本文首發自http://www.rzrgm.cn/jilodream/ )這樣在切換狀態時,業務方法就會調用不同的狀態對象的方法了。從面向對象的角度,實現了狀態變化,類行為的同步變化。
      來看一個具體的代碼示例:

      類圖如下

       

       

      枚舉類

      1 package com.example.demo.learn.pattern.behavior.status;
      2 
      3 public enum TextStatusEnum {
      4     ONLY_READ,
      5     READ_WRITE,
      6     UNAVAILABLE;
      7 
      8 }

      狀態定義接口

       1 package com.example.demo.learn.pattern.behavior.status;
       2 
       3 /**
       4  * @discription
       5  */
       6 public interface TextState {
       7      TextStatusEnum getStatus();
       8 
       9      void write(String content);
      10 
      11      void clear();
      12 
      13      String read();
      14 
      15      void setContent(StringBuilder sb);
      16 }

      只讀狀態

       1 package com.example.demo.learn.pattern.behavior.status;
       2 
       3 import lombok.Data;
       4 import lombok.extern.slf4j.Slf4j;
       5 
       6 /**
       7  * @discription
       8  */
       9 @Slf4j
      10 @Data
      11 public class OnlyReadState implements TextState {
      12     private static final TextStatusEnum textStatus = TextStatusEnum.ONLY_READ;
      13 
      14     private StringBuilder sb;
      15 
      16     @Override
      17     public TextStatusEnum getStatus() {
      18         return textStatus;
      19     }
      20 
      21     public void write(String content) {
      22         log.error("sorry, you can not write");
      23     }
      24 
      25     public void clear() {
      26         log.error("sorry, you can not clear");
      27     }
      28 
      29     public String read() {
      30         return sb.toString();
      31     }
      32 
      33     @Override
      34     public void setContent(StringBuilder sb) {
      35         this.sb = sb;
      36     }
      37 }

      讀寫狀態

       1 package com.example.demo.learn.pattern.behavior.status;
       2 
       3 import lombok.Data;
       4 import lombok.extern.slf4j.Slf4j;
       5 
       6 /**
       7  * @discription
       8  */
       9 @Data
      10 @Slf4j
      11 public class ReadWriteState implements TextState {
      12     private static final TextStatusEnum textStatus = TextStatusEnum.ONLY_READ;
      13 
      14     private StringBuilder sb = new StringBuilder();
      15 
      16     @Override
      17     public TextStatusEnum getStatus() {
      18         return textStatus;
      19     }
      20 
      21     public void write(String content) {
      22         sb.append(content);
      23     }
      24 
      25     public void clear() {
      26         sb.setLength(0);
      27     }
      28 
      29     public String read() {
      30         return sb.toString();
      31     }
      32 
      33     @Override
      34     public void setContent(StringBuilder sb) {
      35         this.sb = sb;
      36     }
      37 }

      本文編輯器(業務類/上下文)

       1 package com.example.demo.learn.pattern.behavior.status;
       2 
       3 import lombok.Data;
       4 import lombok.extern.slf4j.Slf4j;
       5 
       6 /**
       7  * @discription
       8  */
       9 @Slf4j
      10 public class TextEditor {
      11 
      12     private StringBuilder sb = new StringBuilder();
      13 
      14     private TextState textState;
      15 
      16     public void setState(TextState textState) {
      17         textState.setContent(sb);
      18         this.textState = textState;
      19     }
      20 
      21     public void write(String content) {
      22         if (textState == null) {
      23             log.error("no state exist");
      24             return;
      25         }
      26         textState.write(content);
      27     }
      28 
      29     public void clear() {
      30         if (textState == null) {
      31             log.error("no state exist");
      32             return;
      33         }
      34         textState.clear();
      35     }
      36 
      37     public String read() {
      38         if (textState == null) {
      39             log.error("no state exist");
      40             return "no state";
      41         }
      42         return textState.read();
      43     }
      44 
      45 }

      主類

       1 package com.example.demo.learn.pattern.behavior.status;
       2 
       3 import lombok.extern.slf4j.Slf4j;
       4 
       5 /**
       6  * @discription
       7  */
       8 @Slf4j
       9 public class PatternMain {
      10     public static void main(String[] args) {
      11         TextEditor editor = new TextEditor();
      12         String text;
      13 
      14         //可讀寫狀態
      15         TextState rw = new ReadWriteState();
      16         editor.setState(rw);
      17         for (int i = 0; i < 3; i++) {
      18             editor.write("write" + i);
      19             text = editor.read();
      20             log.warn("read :" + text);
      21         }
      22         editor.clear();
      23         text = editor.read();
      24         log.warn("after clear, we read :" + text);
      25         editor.write("last write");
      26 
      27         log.warn("-----------------------now, we exchange state to only read-----------------------" );
      28         //只讀狀態
      29         TextState or = new OnlyReadState();
      30         editor.setState(or);
      31         for (int i = 0; i < 3; i++) {
      32             editor.write("write" + i);
      33             text = editor.read();
      34             log.warn("read :" + text);
      35         }
      36         editor.clear();
      37         text = editor.read();
      38         log.warn("after clear, we read :" + text);
      39     }
      40 }

      輸出效果如下:

      10:02:52.356 [main] WARN com.example.demo.learn.pattern.behavior.status.PatternMain - read :write0
      10:02:52.368 [main] WARN com.example.demo.learn.pattern.behavior.status.PatternMain - read :write0write1
      10:02:52.369 [main] WARN com.example.demo.learn.pattern.behavior.status.PatternMain - read :write0write1write2
      10:02:52.371 [main] WARN com.example.demo.learn.pattern.behavior.status.PatternMain - after clear, we read :(防盜連接:本文首發自http://www.rzrgm.cn/jilodream/ )
      10:02:52.372 [main] WARN com.example.demo.learn.pattern.behavior.status.PatternMain - -----------------------now, we exchange state to only read-----------------------
      10:02:52.376 [main] ERROR com.example.demo.learn.pattern.behavior.status.OnlyReadState - sorry, you can not write
      10:02:52.378 [main] WARN com.example.demo.learn.pattern.behavior.status.PatternMain - read :last write
      10:02:52.378 [main] ERROR com.example.demo.learn.pattern.behavior.status.OnlyReadState - sorry, you can not write
      10:02:52.378 [main] WARN com.example.demo.learn.pattern.behavior.status.PatternMain - read :last write
      10:02:52.379 [main] ERROR com.example.demo.learn.pattern.behavior.status.OnlyReadState - sorry, you can not write
      10:02:52.379 [main] WARN com.example.demo.learn.pattern.behavior.status.PatternMain - read :last write
      10:02:52.379 [main] ERROR com.example.demo.learn.pattern.behavior.status.OnlyReadState - sorry, you can not clear
      10:02:52.380 [main] WARN com.example.demo.learn.pattern.behavior.status.PatternMain - after clear, we read :last write
      
      Process finished with exit code 0

      我們可以看到在最初設置讀寫狀態后,可以做讀、寫、清除等操作

      在設置讀狀態后則只能讀了。

      這樣回頭來看,其實我們就是將不同if Switch的選擇分支,連同選擇的狀態,一同封裝到不同的狀態類中,我們需要新增一種分支邏輯,不再需要修改選擇分支,而是只需要新增一個狀態類即可。
      那是否狀態模式可以替代傳統的if 選擇分支,答案是不能,本質上還是一個度的原因,面相對象如果過度設計,會導致類的數量無限膨脹,難以維護,試想如果存在多個狀態字段(status、type等),則實體對象的狀態是由多個狀態字段組合而成的,每增加一個新的狀態字段,都會導致狀態的數量快速增加,這顯然不是我們想看到的。

      posted @ 2024-09-12 10:23  王若伊_恩賜解脫  閱讀(529)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 免费AV片在线观看网址| 耒阳市| 南皮县| 中文字幕人妻不卡精品| 午夜天堂av天堂久久久| 日韩V欧美V中文在线| 国产成人啪精品午夜网站| 真实单亲乱l仑对白视频| 精品欧美h无遮挡在线看中文 | 久久精品国产亚洲精品| 亚洲国产精品成人精品无码区在线| 亚洲v国产v天堂a无码二区| 小嫩批日出水无码视频免费| 国产 浪潮av性色四虎| 久久精品无码鲁网中文电影| 一区二区三区国产不卡| 国产精品七七在线播放| 伊人狠狠色丁香婷婷综合| 国产94在线 | 亚洲| 无码专区人妻系列日韩精品少妇 | 亚洲精品久荜中文字幕| 国产综合av一区二区三区| 中文字幕人妻少妇引诱隔壁| 99久久亚洲综合精品成人| 50岁熟妇的呻吟声对白| 中文字幕日韩国产精品| 精品自拍偷拍一区二区三区| 亚洲aⅴ天堂av天堂无码麻豆| 午夜射精日本三级| 国产香蕉尹人综合在线观看| 国产成人精品中文字幕| 亚洲精品自拍视频在线看| 中文字幕乱码无码人妻系列蜜桃| 亚洲综合一区国产精品| 一区二区三区av在线观看| 99精品国产中文字幕| 精品一区二区成人码动漫| 国产电影一区二区三区| 亚洲高清aⅴ日本欧美视频| chinese性内射高清国产| 成人午夜免费无码视频在线观看 |