狀態模式
簡介
在狀態模式(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();
功能實作


類別庫:直接下載
完整專案:直接下載
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/115444.html
標籤:C#
上一篇:Winform中使用FastReport的PictureObject時通過代碼設定圖片源并使Image圖片旋轉90度
