設計模式之☞狀態模式實戰

狀態模式

簡介

  在狀態模式(State Pattern)中,類的行爲是基於它的狀態改變的。這種類型的設計模式屬於行爲型模式。在狀態模式中,我們創建表示各種狀態的對象和一個行爲隨着狀態對象改變而改變的 context 對象。

特點

意圖:允許對象在內部狀態發生改變時改變它的行爲,對象看起來好像修改了它的類。

主要解決:對象的行爲依賴於它的狀態(屬性),並且可以根據它的狀態改變而改變它的相關行爲。

何時使用:代碼中包含大量與對象狀態有關的條件語句。

使用場景: 1、行爲隨狀態改變而改變的場景。 2、條件、分支語句的代替者。

需求

業務需求:公司架構一個模塊需統計pdf紙張大小數量,需要利用開源的一個類庫(itextsharp.dll),紙張規格圖如下,由於需要多個條件判斷,第一想到了使用狀態模式,以後便於維護,完整代碼如下

 

 

 實現

1)創建抽象類:State.cs

namespace PdfUtui.GoF
{
    public abstract class State
    {
        public abstract void Handle(Context context);
    }
}

2)創建上下文:Context.cs

namespace PdfUtui.GoF
{
    public class Context
    {
        public State state { get; set; }
        public string mapType { get; set; }
        public int pdfWidth { get; set; }
        public int pdfHeight { get; set; }
        public Context(State state)
        {
            this.state = state;
        }
        public void Request()
        {
            state.Handle(this);
        }
    }
}

3)實現抽象類:MapSizeA0.cs

namespace PdfUtui.GoF
{
    public class MapSizeA0 : State
    {
        public override void Handle(Context context)
        {
            if (context.pdfWidth==841&&context.pdfHeight==1189)
            {
                context.mapType = "A0";
            }
            context.state = new MapSizeA0Plus();
        }
    }
}

MapSizeA0Plus.cs

namespace PdfUtui.GoF
{
    public class MapSizeA0Plus : State
    {
        public override void Handle(Context context)
        {
            if (context.pdfWidth == 841 && context.pdfHeight > 1189)
            {
                context.mapType = "A0Plus";
            }
            context.state = new MapSizeA1();
        }
    }
}

。。。。其他抽象類方法類似

4)項目圖

 

 5)主要實現代碼

Context context = new Context(new MapSizeA0());
context.pdfHeight = (int)Math.Floor(rectangle.Height*25.4/72);
context.pdfWidth = (int)Math.Floor(rectangle.Width * 25.4 / 72);
context.Request();
context.Request();
context.Request();
context.Request();
context.Request();
context.Request();
context.Request();
context.Request();
context.Request();
context.Request();

功能實現

 

 

 

 類庫:直接下載

完整項目:直接下載