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

下載本文檔

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

文檔簡(jiǎn)介

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

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

3、行封裝,由具體狀態(tài)角色予以不同的實(shí)現(xiàn)。    3、具體狀態(tài)角色 Concrete State:繼承自抽象狀態(tài)角色,并具體實(shí)現(xiàn)抽象狀態(tài)角色定義的接口功能,同時(shí)還提供了不同具體狀態(tài)角色間的切換判斷以根據(jù)狀態(tài)屬主角色對(duì)象的某些條件來(lái)決定何時(shí)以及如何進(jìn)行狀態(tài)的切換。   下面我們用代碼來(lá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ù)請(qǐng)求      

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、客戶(hù)應(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    二、俱樂(lè)部會(huì)員服務(wù)的狀態(tài)模式實(shí)現(xiàn)   定義一個(gè)俱樂(lè)部,它的顧客有三個(gè)狀態(tài):一般訪客,普通會(huì)員,貴賓會(huì)員。每個(gè)顧客都有一個(gè)帳戶(hù),帳戶(hù)上存放顧客的存款,根據(jù)存款的不同數(shù)量切換會(huì)員的級(jí)別,當(dāng)顧客提請(qǐng)俱樂(lè)

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

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

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

23、    #endregion        #region 帳戶(hù)狀態(tài)State屬性        /ClubAccount類(lèi)中包含了State類(lèi)對(duì)象實(shí)例,而正是因?yàn)镾tate類(lèi)的具體對(duì)象實(shí)例(VIPState,MemberSate,VisitorState決定了ClubAccount類(lèi)對(duì)象的不同具體表現(xiàn)       &

24、#160;/因?yàn)镃lubAccount類(lèi)的Deposit,Cost,Service動(dòng)作都是依托(VIPState,MemberSate,VisitorState類(lèi)對(duì)象來(lái)實(shí)現(xiàn)的        private ClubState _state;        public ClubState State        &#

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

26、    #endregion        #region 帳戶(hù)Balance屬性        public double Balance                   &

27、#160;get  return _state.Balance;                 #endregion        #region 構(gòu)造函數(shù)        public ClubAccount(stri

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

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 俱樂(lè)部相關(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    /俱樂(lè)部會(huì)員狀態(tài)類(lè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; /存錢(qián)        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    /這時(shí)定義一系列具體的State類(lèi)    /這些類(lèi)繼承自抽象的ClubState類(lèi),并完成ClubState類(lèi)定義的功能    /其中包括狀態(tài)判斷與切換,它們將根據(jù)ClubAccount的當(dāng)前balance屬性來(lái)決定是否切換狀態(tài)以及向哪個(gè)狀態(tài)切換 

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

45、級(jí)狀態(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)前帳戶(hù)金額為 0,你可以享受普通會(huì)員服務(wù)!",balance.ToString(;       

55、                     public override void ClubService(                    Consol

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

57、;      /構(gòu)造函數(shù)中必須有ClubState對(duì)象,因?yàn)樗仨毾窠恿Π粢粯影焉弦粋€(gè)狀態(tài)的State對(duì)象交接過(guò)來(lái),在進(jìn)行狀態(tài)切換的同時(shí)保留上一級(jí)狀態(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)前帳戶(hù)金額為 0,你只能享受訪客級(jí)會(huì)員服務(wù)!", balance.ToString(;                        else if(balance >=

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

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

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

71、; #endregion    #region 貴賓會(huì)員     class VIPState : ClubState            /構(gòu)造函數(shù)中必須有ClubState對(duì)象,因?yàn)樗仨毾窠恿Π粢粯影焉弦粋€(gè)狀態(tài)的State對(duì)象交接過(guò)來(lái),在進(jìn)行狀態(tài)切換的同時(shí)保留上一級(jí)狀態(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元,你的帳戶(hù)還有1元",amount.ToString(,balance.ToString(;            StateChangeCheck(;    

溫馨提示

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

評(píng)論

0/150

提交評(píng)論