<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                定義:狀態模式(State Pattern),允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。 類型:對象行為型模式 概述: ????????一個對象有一個狀態,那么每一個狀態又對應一些相應的行為。如果這個對象有很多狀態,那么就要對應非常多的行為。那么對這些狀態的判斷以及根據狀態完成相應的行為,會非常復雜。并且如果想添加一種新的狀態時,需要修改很多的現有代碼。這也是有違開閉原則的。狀態模式正是在這樣一種情況下提出來的。 ???????狀態模式將每種狀態對應的行為抽象出來成為單獨的新的對象,這樣將狀態轉換顯式化了。狀態的變換不再依賴于Context內部的行為了。另外,將狀態及行為提出來能夠大為降低Context對象的復雜度。另外如果一個State對應多個Context時,State還可以被多個Context對象共享。 ???????狀態,我們立馬會提出,今天狀態不好,做什么都沒勁;又或者是今天狀態很好,做事得勁,飯也吃得多。那么我們就以一個人不同時刻的狀態為例來講解狀態模式。 類圖: ![](https://box.kancloud.cn/2016-08-19_57b6b467964dc.jpg) 參與者: 1. Human,也即Context通過抽象接口來調用狀態對象的具體實現。 1. State,封裝了與Human相關行為的接口。 1. Happy,Sad,具體實現了與相應狀態下的行為。 示例代碼: ~~~ using System; using System.Collections.Generic; using System.Text; namespace Pattern21 { //抽象狀態 public abstract class State { public abstract void Eat(); public abstract void Walk(); } // 高興時的狀態 public class Happy : State { public override void Eat() { human.Eat(); Console.WriteLine("很多!"); } public override void Walk() { human.Walk(); Console.WriteLine("手舞足蹈的!"); } public void Attach(Human _human) { human = _human; } private Human human; } // 傷心時的狀態 public class Sad : State { public override void Eat() { human.Eat(); Console.WriteLine("很少!"); } public override void Walk() { human.Walk(); Console.WriteLine("無精打采的!"); } public void Attach(Human _human) { human = _human; } private Human human; } // 一個人 public class Human { private State current; public void SetState(State s) { current = s; } public void Eat() { Console.Write("吃了"); } public void Walk() { Console.Write("走起路來"); } public void Show() { current.Eat(); current.Walk(); } } class Program { static void Main(string[] args) { // 定義一個有很多狀態的對象 Human human = new Human(); // 定義一個高興的狀態 Happy hState = new Happy(); hState.Attach(human); human.SetState(hState); human.Show(); // 定義一個傷心的狀態 Sad sad = new Sad(); sad.Attach(human); human.SetState(sad); human.Show(); // 還可以添加生病的狀態,只需要添加新的類而不需要修改Human類 // ...... Console.Read(); } } } ~~~ 適用性: 1. 一個對象的行為取決于它的狀態,并且它必須在運行時刻根據狀態改變它的行為。 1. 一個操作中含有龐大的多分支的條件語句,且這些分支依賴于該對象的狀態。 優缺點: 1. 優點,將狀態判斷的邏輯移到類外面,方便通過添加新類來添加新的狀態。 1. 缺點,如果狀態非常多,會導致有非常多的狀態類,加大開銷。 參考資料: 1. 《設計模式——可復用面向對象軟件基礎》 1. 《大話設計模式》
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看