小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

設(shè)計模式-行為型-狀態(tài)模式

 Coder編程 2020-06-23

狀態(tài)模式(State):

  在軟件開發(fā)過程中,應(yīng)用程序可能會根據(jù)不同的情況作出不同的處理。最直接的解決方案是將這些所有可能發(fā)生的情況全都考慮到,然后使用if else語句來做狀態(tài)判斷來進行不同情況的處理。但對復(fù)雜狀態(tài)的判斷就顯得"力不從心了",隨著增加新的狀態(tài)或者修改一個狀體if else(或switch case)語句的增多或者修改)可能會引起很大的修改,違反OCP原則。狀態(tài)模式就是在當(dāng)控制一個對象狀態(tài)轉(zhuǎn)換的條件表達式過于復(fù)雜時,把相關(guān)"判斷邏輯"提取出來,放到一系列的狀態(tài)類當(dāng)中,這樣可以把原來復(fù)雜的邏輯判斷簡單化。

狀態(tài)模式的角色:

  

  1)環(huán)境類(Context):也稱為上下文,它定義了客戶感興趣的接口,維護一個當(dāng)前狀態(tài),并將與狀態(tài)相關(guān)的操作委托給當(dāng)前狀態(tài)對象來處理。

  2)抽象狀態(tài)類(AbstractState):定義一個接口以封裝與Context的一個特定狀態(tài)相關(guān)的行為。

  3)具體狀態(tài)類(ConcreteState):實現(xiàn)抽象狀態(tài)所對應(yīng)的行為。

狀態(tài)模式的代碼實現(xiàn): 

 1 internal class Program
 2 {
 3     private static void Main(string[] args)
 4     {
 5         // Setup context in a state
 6         Context c = new Context(new ConcreteStateA());
 7 
 8         // Issue requests, which toggles state
 9         c.Request();
10         c.Request();
11     }
12 }
13 
14 public abstract class AbstractState
15 {
16     public abstract void Handler(Context context);
17 }
18 
19 public class Context
20 {
21     private AbstractState state;
22 
23     public Context(AbstractState state)
24     {
25         this.state = state;
26     }
27 
28     public AbstractState State
29     {
30         get
31         {
32             return state;
33         }
34         set
35         {
36             state = value;
37             Console.WriteLine("State: " + state.GetType().Name);
38         }
39     }
40 
41     public void Request()
42     {
43         state.Handler(this);
44     }
45 }
46 
47 public class ConcreteStateA : AbstractState
48 {
49     public override void Handler(Context context)
50     {
51         context.State = new ConcreteStateB();
52     }
53 }
54 
55 public class ConcreteStateB : AbstractState
56 {
57     public override void Handler(Context context)
58     {
59         context.State = new ConcreteStateC();
60     }
61 }
62 
63 public class ConcreteStateC : AbstractState
64 {
65     public override void Handler(Context context)
66     {
67         context.State = new ConcreteStateA();
68     }
69 }

實例:(以電燈開關(guān)為例) 

 1 internal class Program
 2 {
 3     private static void Main(string[] args)
 4     {
 5         Light light = new Light(new LightOff());
 6         light.PressSwich();
 7         light.PressSwich();
 8     }
 9 }
10 
11 /// <summary>
12 /// 抽象電燈狀態(tài)類
13 /// </summary>
14 public abstract class LightState
15 {
16     public abstract void PressSwich(Light light);
17 }
18 
19 public class Light
20 {
21     private LightState state;
22 
23     public Light(LightState state)
24     {
25         this.state = state;
26     }
27 
28     public LightState State
29     {
30         get { return state; }
31         set { state = value; }
32     }
33 
34     public void PressSwich()
35     {
36         state.PressSwich(this);
37     }
38 }
39 
40 /// <summary>
41 /// 電燈打開狀態(tài)
42 /// </summary>
43 public class LightOn : LightState
44 {
45     public override void PressSwich(Light light)
46     {
47         Console.WriteLine("Turn off the light.");
48         light.State = new LightOff();
49     }
50 }
51 
52 /// <summary>
53 /// 電燈關(guān)閉狀態(tài)
54 /// </summary>
55 public class LightOff : LightState
56 {
57     public override void PressSwich(Light light)
58     {
59         Console.WriteLine("Turn on the light.");
60         light.State = new LightOn();
61     }
62 }

狀態(tài)模式的優(yōu)缺點:

  優(yōu)點:

    1)狀態(tài)模式將與特定狀態(tài)相關(guān)的行為局部化到一個狀態(tài)中,并且將不同狀態(tài)的行為分割開來,滿足“單一職責(zé)原則”。

    2)減少對象間的相互依賴。將不同的狀態(tài)引入獨立的對象中會使得狀態(tài)轉(zhuǎn)換變得更加明確,且減少對象間的相互依賴。

    3)有利于程序的擴展。通過定義新的子類很容易地增加新的狀態(tài)和轉(zhuǎn)換。

  缺點:

    1)狀態(tài)模式的使用必然會增加系統(tǒng)的類與對象的個數(shù)。

    2)狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)都較為復(fù)雜,如果使用不當(dāng)會導(dǎo)致程序結(jié)構(gòu)和代碼的混亂。

狀態(tài)模式的應(yīng)用場景:

  1)當(dāng)一個對象的行為取決于它的狀態(tài),并且它必須在運行時根據(jù)狀態(tài)改變它的行為。

  2)一個操作中含有龐大的分支結(jié)構(gòu),并且這些分支決定于對象的狀態(tài)。

狀態(tài)模式與策略模式的區(qū)別:

  從UML圖上我們會發(fā)現(xiàn)這兩種設(shè)計模式幾乎一摸一樣,都是利用多態(tài)把一些操作分配到一組相關(guān)的簡單的類中。然而在顯示世界中,策略模式和狀態(tài)模式是兩種完全不同的思想。對狀態(tài)進行建模時,狀態(tài)遷移是一個核心問題;但策略模式與遷移毫無關(guān)系,策略模式允許一個客戶選擇或提供一種策略。

狀態(tài)模式與責(zé)任鏈模式的區(qū)別:

  職責(zé)鏈模式和狀態(tài)模式都可以解決if分支過多的問題,從定義來看,狀態(tài)模式是一個對象內(nèi)在狀態(tài)發(fā)生改變(一個對象,相對穩(wěn)定,處理完一個對象下一個對象一般已確定),而職責(zé)鏈模式是多個對象之間的改變(多個對象之間的話,就會出現(xiàn)某個對象不存在的問題,且該模式由客戶端指定,不穩(wěn)定),這也說明了這兩個模式處理的情況不同。

參考:https://www.runoob.com/w3cnote/state-vs-strategy.html

  https://blog.csdn.net/hguisu/article/details/7557252

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多