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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、  所謂狀態(tài)模式是指:當(dāng)一個對象的內(nèi)部狀態(tài)改變時,它的行為也隨之改變,如何解藕狀態(tài)與行為之間的藕合關(guān)系,且避免大量的if.else語句的出現(xiàn),從而使得“對象看起來似乎修改了它的類”。    狀態(tài)模式的實(shí)現(xiàn)非常的簡單,就是將狀態(tài)抽象出來,然后在狀態(tài)中處理這些請求,這也是面向?qū)ο蟪橄筇卣鞯幕緫?yīng)用。    狀態(tài)模式的UML圖如下:                 

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

3、行封裝,由具體狀態(tài)角色予以不同的實(shí)現(xiàn)。    3、具體狀態(tài)角色 Concrete State:繼承自抽象狀態(tài)角色,并具體實(shí)現(xiàn)抽象狀態(tài)角色定義的接口功能,同時還提供了不同具體狀態(tài)角色間的切換判斷以根據(jù)狀態(tài)屬主角色對象的某些條件來決定何時以及如何進(jìn)行狀態(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 構(gòu)造函數(shù)        public Context(State state          

9、          this._state = state;                #endregion        #region 服務(wù)請求      

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、客戶應(yīng)用:            #region 基本思路

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

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

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

20、部的服務(wù)時,俱樂部將根據(jù)顧客的當(dāng)前級別提供與其級別對應(yīng)的服務(wù)內(nèi)容。當(dāng)然,顧客可以存入或消費(fèi),并及時修改他們的帳戶。   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類對象實(shí)例,而正是因?yàn)镾tate類的具體對象實(shí)例(VIPState,MemberSate,VisitorState決定了ClubAccount類對象的不同具體表現(xiàn)       &

24、#160;/因?yàn)镃lubAccount類的Deposit,Cost,Service動作都是依托(VIPState,MemberSate,VisitorState類對象來實(shí)現(xiàn)的        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 構(gòu)造函數(shù)        public ClubAccount(stri

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

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 俱樂部相關(guān)服務(wù)        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;    /消費(fèi)        public abstract void ClubService(;          /享受服務(wù)       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)判斷與切換,它們將根據(jù)ClubAccount的當(dāng)前balance屬性來決定是否切換狀態(tài)以及向哪個狀態(tài)切換 

44、0;  /而ClubAccount已經(jīng)在構(gòu)造ClubState類時作為屬性傳遞給了它    #region 一般消費(fèi)者    class VisitorState : ClubState            /構(gòu)造函數(shù)中必須有ClubState對象,因?yàn)樗仨毾窠恿Π粢粯影焉弦粋€狀態(tài)的State對象交接過來,在進(jìn)行狀態(tài)切換的同時保留上一

45、級狀態(tài)的歷史數(shù)據(jù)        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("你這次消費(fèi)了0元", amount.ToString(;            StateChangeCheck(;                private void StateChangeChec

53、k(                    if (balance >= upperLimit                      

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

55、                     public override void ClubService(                    Consol

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

57、;      /構(gòu)造函數(shù)中必須有ClubState對象,因?yàn)樗仨毾窠恿Π粢粯影焉弦粋€狀態(tài)的State對象交接過來,在進(jìn)行狀態(tài)切換的同時保留上一級狀態(tài)的歷史數(shù)據(jù)        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("你這次消費(fèi)了0元", amount.ToString(;          

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

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

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

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

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

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

71、; #endregion    #region 貴賓會員     class VIPState : ClubState            /構(gòu)造函數(shù)中必須有ClubState對象,因?yàn)樗仨毾窠恿Π粢粯影焉弦粋€狀態(tài)的State對象交接過來,在進(jìn)行狀態(tài)切換的同時保留上一級狀態(tài)的歷史數(shù)據(jù)    &#

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("你這次消費(fèi)了0元,你的帳戶還有1元",amount.ToString(,balance.ToString(;            StateChangeCheck(;    

溫馨提示

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

評論

0/150

提交評論