設計模式學習筆記--State狀態(tài)模式_第1頁
設計模式學習筆記--State狀態(tài)模式_第2頁
設計模式學習筆記--State狀態(tài)模式_第3頁
設計模式學習筆記--State狀態(tài)模式_第4頁
設計模式學習筆記--State狀態(tài)模式_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、  所謂狀態(tài)模式是指:當一個對象的內部狀態(tài)改變時,它的行為也隨之改變,如何解藕狀態(tài)與行為之間的藕合關系,且避免大量的if.else語句的出現,從而使得“對象看起來似乎修改了它的類”。    狀態(tài)模式的實現非常的簡單,就是將狀態(tài)抽象出來,然后在狀態(tài)中處理這些請求,這也是面向對象抽象特征的基本應用。    狀態(tài)模式的UML圖如下:                 

2、;           相關角色:    1、狀態(tài)屬主角色Context: 就是狀態(tài)所描述的事物,如一只狗的狀態(tài)為睡,站,走,跑,叫.,那么我們所定義的一個類"Dog"就是這里的Context。此角色要定義一些外部關注的接口或服務功能等,同時還要維護一個具體狀態(tài)角色的實例對象。    2、抽象狀態(tài)角色State:它是抽象類或接口,是具體狀態(tài)角色的基類,它定義了具體狀態(tài)角色所共有的行為并進

3、行封裝,由具體狀態(tài)角色予以不同的實現。    3、具體狀態(tài)角色 Concrete State:繼承自抽象狀態(tài)角色,并具體實現抽象狀態(tài)角色定義的接口功能,同時還提供了不同具體狀態(tài)角色間的切換判斷以根據狀態(tài)屬主角色對象的某些條件來決定何時以及如何進行狀態(tài)的切換。   下面我們用代碼來示例State狀態(tài)模式。   程序如下圖:                

4、60;          一、狀態(tài)模式基本思路示例   1、狀態(tài)屬主角色Context:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyStatePattern    class Context    

5、;        #region State屬性        private State _state;        public State State            

6、0;       get  return _state;             set                       

7、60;    _state = value;                Console.WriteLine("State:0", _state.GetType(.Name;              

8、60;             #endregion        #region 構造函數        public Context(State state          

9、          this._state = state;                #endregion        #region 服務請求      

10、60; public void Request(                    _state.Handle(this;                #endregion  

11、0;    2、抽象狀態(tài)角色State:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyStatePattern    #region 抽象狀態(tài)角色    abstract class State      &

12、#160;     public abstract void Handle(Context context;        #endregion   3、具體狀態(tài)角色Concrete State:using System;using System.Collections.Generic;using System.Linq;using System.Text;names

13、pace MyStatePattern    /定義具體狀態(tài)角色    #region 具體狀態(tài)角色A    class ConcreteStateA:State            public override void Handle(Context context 

14、60;                  context.State = new ConcreteStateB(;                #endregion    #region&

15、#160;具體狀態(tài)角色B    class ConcreteStateB : State            public override void Handle(Context context              &#

16、160;     context.State = new ConcreteStateA(;                #endregion   4、客戶應用:            #region 基本思路

17、示例              Console.WriteLine("-基本思路示例-"            Context c = new Context(new ConcreteStateA(;      

18、;      c.Request(;            c.Request(;            c.Request(;            c.Request(;

19、60;           Console.ReadKey(;            #endregion    二、俱樂部會員服務的狀態(tài)模式實現   定義一個俱樂部,它的顧客有三個狀態(tài):一般訪客,普通會員,貴賓會員。每個顧客都有一個帳戶,帳戶上存放顧客的存款,根據存款的不同數量切換會員的級別,當顧客提請俱樂

20、部的服務時,俱樂部將根據顧客的當前級別提供與其級別對應的服務內容。當然,顧客可以存入或消費,并及時修改他們的帳戶。   1、狀態(tài)屬主角色Context:ClubAccountusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyStatePattern    class ClubAccount    &#

21、160;       #region 帳戶姓名屬性        private string _customerName;        public string CustomerName          

22、0;         get  return _customerName;             set  _customerName = value;             

23、    #endregion        #region 帳戶狀態(tài)State屬性        /ClubAccount類中包含了State類對象實例,而正是因為State類的具體對象實例(VIPState,MemberSate,VisitorState決定了ClubAccount類對象的不同具體表現       &

24、#160;/因為ClubAccount類的Deposit,Cost,Service動作都是依托(VIPState,MemberSate,VisitorState類對象來實現的        private ClubState _state;        public ClubState State        &#

25、160;           get  return _state;             set  _state = value;             

26、    #endregion        #region 帳戶Balance屬性        public double Balance                   &

27、#160;get  return _state.Balance;                 #endregion        #region 構造函數        public ClubAccount(stri

28、ng name                    / 新注冊的客戶默認為Visitor類型客戶狀態(tài)            /同時通過此處的this把Account帳戶與State關聯起來      

29、;      this.CustomerName = name;            this.State = new VisitorState(0.0, this;                

30、 public ClubAccount(string name,ClubState state                    this.CustomerName = name;            this.S

31、tate = state;                #endregion        #region 存款        public void Deposit(double amount  

32、                  _state.Deposit(amount;                #endregion        #region 取款&

33、#160;       public void Cost(double amount                    _state.Cost(amount;           

34、60;    #endregion        #region 俱樂部相關服務        public void ClubService(                   

35、; _state.ClubService(;                #endregion       2、抽象狀態(tài)角色State:ClubStateusing System;using System.Collections.Generic;using System.Linq;using System.Text;names

36、pace MyStatePattern    /俱樂部會員狀態(tài)類    abstract  class ClubState            protected double lowerLimit; /下限        protected

37、60;double upperLimit; /上限        #region Account屬性        protected ClubAccount account;        public ClubAccount Account    

38、;                get  return account;             set  account = value;        &

39、#160;        #endregion        #region Balance屬性        protected double balance;        public double Balance 

40、;                   get  return balance;             set  balance = value;     &

41、#160;           #endregion        public abstract void Deposit(double amount; /存錢        public abstract void Cost(double

42、0;amount;    /消費        public abstract void ClubService(;          /享受服務       3、具體狀態(tài)角色Concrete State:ClubRealStatesusing System;using 

43、;System.Collections.Generic;using System.Linq;using System.Text;namespace MyStatePattern    /這時定義一系列具體的State類    /這些類繼承自抽象的ClubState類,并完成ClubState類定義的功能    /其中包括狀態(tài)判斷與切換,它們將根據ClubAccount的當前balance屬性來決定是否切換狀態(tài)以及向哪個狀態(tài)切換 

44、0;  /而ClubAccount已經在構造ClubState類時作為屬性傳遞給了它    #region 一般消費者    class VisitorState : ClubState            /構造函數中必須有ClubState對象,因為它必須像接力棒一樣把上一個狀態(tài)的State對象交接過來,在進行狀態(tài)切換的同時保留上一

45、級狀態(tài)的歷史數據        public VisitorState(ClubState state :            this(state.Balance,state.Account              

46、0;                    public VisitorState(double balance,ClubAccount account                  &

47、#160; this.balance = balance;            this.Account = account;            Initialize(;           &

48、#160;    private void Initialize(                    lowerLimit = 0.0;            upperLimit =&

49、#160;100;                public override void Deposit(double amount                    balance 

50、+= amount;            Console.WriteLine("你這次存入了0元", amount.ToString(;            StateChangeCheck(;          &

51、#160;     public override void Cost(double amount                    balance -= amount;         

52、0;  Console.WriteLine("你這次消費了0元", amount.ToString(;            StateChangeCheck(;                private void StateChangeChec

53、k(                    if (balance >= upperLimit                      

54、60;     account.State = new MemberState(this;                Console.WriteLine("你當前帳戶金額為 0,你可以享受普通會員服務!",balance.ToString(;       

55、                     public override void ClubService(                    Consol

56、e.WriteLine("你申請了服務=>俱樂部提供一般客戶的服務內容!"                #endregion    #region 普通會員    class MemberState : ClubState      

57、;      /構造函數中必須有ClubState對象,因為它必須像接力棒一樣把上一個狀態(tài)的State對象交接過來,在進行狀態(tài)切換的同時保留上一級狀態(tài)的歷史數據        public MemberState(ClubState state            : this(state.Balance,

58、 state.Account                    this.balance = state.Balance;                public MemberState(do

59、uble balance, ClubAccount service                    this.balance = balance;            this.account = se

60、rvice;            Initialize(;                private void Initialize(             &#

61、160;      lowerLimit = 100.0;            upperLimit = 1000;                public override void 

62、;Deposit(double amount                    balance += amount;            Console.WriteLine("你這次存入了0元", amount.T

63、oString(;            StateChangeCheck(;                public override void Cost(double amount       

64、0;            balance -= amount;            Console.WriteLine("你這次消費了0元", amount.ToString(;          

65、0; StateChangeCheck(;                private void StateChangeCheck(                    if (balance&#

66、160;< lowerLimit                            account.State = new VisitorState(this;         &

67、#160;      Console.WriteLine("你當前帳戶金額為 0,你只能享受訪客級會員服務!", balance.ToString(;                        else if(balance >=

68、 upperLimit                             account.State = new VIPState(this;          &

69、#160;     Console.WriteLine("你當前帳戶金額為 0,你可以享受貴賓級會員服務!", balance.ToString(;                            public o

70、verride void ClubService(                    Console.WriteLine("你申請了服務=>俱樂部提供普通會員的服務內容!"               

71、; #endregion    #region 貴賓會員     class VIPState : ClubState            /構造函數中必須有ClubState對象,因為它必須像接力棒一樣把上一個狀態(tài)的State對象交接過來,在進行狀態(tài)切換的同時保留上一級狀態(tài)的歷史數據    &#

72、160;   public VIPState(ClubState state:this(state.Balance,state.Account                                this.balance

73、 = state.Balance;                public VIPState(double balance, ClubAccount service                 

74、0;  this.balance = balance;            this.account = service;            Initialize(;          

75、0;     private void Initialize(                    lowerLimit = 1000.0;              

76、  public override void Deposit(double amount                    balance += amount;            Consol

77、e.WriteLine("你這次存入了0元", amount.ToString(;            StateChangeCheck(;                public override void Cost(double amoun

78、t                    balance -= amount;            Console.WriteLine("你這次消費了0元,你的帳戶還有1元",amount.ToString(,balance.ToString(;            StateChangeCheck(;    

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論