程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++設計形式之狀況形式

C++設計形式之狀況形式

編輯:關於C++

C++設計形式之狀況形式。本站提示廣大學習愛好者:(C++設計形式之狀況形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C++設計形式之狀況形式正文


媒介

在現實開辟中,我們常常會碰到這類情形;一個對象有多種狀況,在每個狀況下,都邑有分歧的行動。那末在代碼中我們常常是如許完成的。


typedef enum tagState
{
     state,
     state1,
     state2
}State;
 
void Action(State actionState)
{
     if (actionState == state)
     {
          // DoSomething
     }
     else if (actionState == state1)
     {
          // DoSomething
     }
     else if (actionState == state2)
     {
          // DoSomething
     }
     else
     {
          // DoSomething
     }
}

而這類就比如簡略工場形式,當我們增長新的狀況類型時,我們又須要修正本來的代碼,這類關於測試是很晦氣的;因為簡略工場的缺陷那末的顯著,後來的工場形式就戰勝了這個缺陷,我們便可以自創工程形式,來處理這類跟著狀況增長而湧現的多分支構造,而這就是我明天要總結的狀況形式。

狀況形式

在GOF的《設計形式:可復用面向對象軟件的基本》一書中對狀況形式是如許說的:許可一個對象在其外部狀況轉變時轉變它的行動。對象看起來仿佛修正了它的類。狀況形式的重點在於狀況轉換,許多時刻,關於一個對象的狀況,我們都是讓這個對象包括一個狀況的屬性,這個狀況屬性記載著對象的詳細狀況,依據狀況的分歧應用分支構造來履行分歧的功效,就像下面的代碼那樣處置;就像下面說的,類中存在年夜量的構造相似的分支語句,變得難以保護和懂得。狀況形式清除了分支語句,就像工場形式清除了簡略工場形式的分支語句一樣,將狀況處置疏散到各個狀況子類中去,每一個子類集中處置一種狀況,如許就使得狀況的處置和轉換清楚明白。

UML類圖

Context:界說客戶端感興致的接口,而且保護一個ConcreteState子類的實例,這個實例界說以後狀況;
State:界說一個接口以封裝與Context的一個特定狀況相干的行動;
ConcreteState subclasses:每個子類完成一個與Context的一個狀況相干的行動。

它們之間的協作步調以下:

1.Context將與狀況相干的要求拜托給以後的ConcreteState對象處置;
2.Context可以將本身作為一個參數傳遞給處置該要求的狀況對象。這使得狀況對象在需要時可以拜訪Context;
3.Context是客戶應用的重要接口。客戶可用狀況對象來設置裝備擺設一個Context,一旦一個Context設置裝備擺設終了,它的客戶不再須要直接與狀況對象打交道;

應用場所

在以下兩種情形下都可應用State形式:

1.一個對象的行動取決於它的狀況,而且它必需在運轉時辰依據狀況轉變它的行動;
2.一個操作中含有宏大的多分支的前提語句,且這些分支依附於該對象的狀況。這個狀況平日用一個或多個列舉常量表現。平日有多個操作包括這一雷同的前提構造。State形式將每個前提分支放入一個自力的類中。這使得你可以依據對象本身的情形將對象的狀況作為一個對象,這一對象可以不依附於其它對象而自力變更。

代碼完成:

#include <iostream>
using namespace std;
 
class Context;
 
class State
{
public:
     virtual void Handle(Context *pContext) = 0;
};
 
class ConcreteStateA : public State
{
public:
     virtual void Handle(Context *pContext)
     {
          cout<<"I am concretestateA."<<endl;
     }
};
 
class ConcreteStateB : public State
{
public:
     virtual void Handle(Context *pContext)
     {
          cout<<"I am concretestateB."<<endl;
     }
};
 
class Context
{
public:
     Context(State *pState) : m_pState(pState){}
 
     void Request()
     {
          if (m_pState)
          {
               m_pState->Handle(this);
          }
     }
 
     void ChangeState(State *pState)
     {
          m_pState = pState;
     }
 
private:
     State *m_pState;
};
 
int main()
{
     State *pStateA = new ConcreteStateA();
     State *pStateB = new ConcreteStateB();
     Context *pContext = new Context(pStateA);
     pContext->Request();
 
     pContext->ChangeState(pStateB);
     pContext->Request();
 
     delete pContext;
     delete pStateB;
     delete pStateA;
}

總結

狀況形式總的來講長短常好懂得的;沒有何等深邃的時序關系,就是簡略的將對象的狀況和對應狀況下的行動分別開來,不再是簡略的if…else或switch…case分支構造了,而是每個狀況都對應一個類,一個類集中治理一個狀況;在多狀況的情形下,簡化了法式的保護和治理,讓法式構造簡明化,同時也易於擴大。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved