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

来源:https://www.cnblogs.com/chenyanbin/archive/2019/10/23/11726151.html
-Advertisement-
Play Games

狀態模式 簡介 在狀態模式(State Pattern)中,類的行為是基於它的狀態改變的。這種類型的設計模式屬於行為型模式。在狀態模式中,我們創建表示各種狀態的對象和一個行為隨著狀態對象改變而改變的 context 對象。 特點 意圖:允許對象在內部狀態發生改變時改變它的行為,對象看起來好像修改了它 ...


狀態模式

簡介

  在狀態模式(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();

功能實現

 

 

 

 類庫:直接下載

完整項目:直接下載


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • sqlsercer事務的使用總結,主要簡單減少sql事務的使用以及一些註意點。根據SQLSERVER實現原理,其實,SQLSERVER的每一條執行語句都是一個事務操作,也就是說每一個SQL語句要麼操作都成功,要麼操作都失敗:比如,更新語句,同時更新多個欄位,不會出現有的欄位更新成功,有的欄位更新失敗... ...
  • 本文摘自LTP.NET知識庫。 正則表達式的形式一般如下: 其中位於“/”定界符之間的部分就是將要在目標對象中進行匹配的模式。 用戶只要把希望查找匹配對象的模式內容放入“/”定界符之間即可。 為了能夠使用戶更加靈活的定製模式內容,正則表達式提供了專門的“ 元字元 ”。 所謂元字元就是指那些在正則表達 ...
  • 本人嘗試著利用C#語言來寫一個房貸計算器控制台程式。由於剛開始學,錯誤與失誤之處會很多。希望大家多多批評指正,我會持續改進。謝謝大家。 using System;using System.Collections.Generic;using System.Linq;using System.Text; ...
  • 問題 有一批數據,需要對每個元素進行相同的操作。該操作是計算密集型的,需要耗費一定的時間。 解決方案 常見的操作可以粗略分為 計算密集型操作 和 IO密集型操作。計算密集型操作主要是依賴於CPU計算,所以可以最大限度利用多核CPU的並行操作非常適合計算密集型操作。圖像操作是比較常見的計算密集型操作, ...
  • 我們在使用到WINFORM窗體工作中,要求RichTextBox 加入行號; 之前有看到大牛們寫的,但是太複雜繁多,而且有用雙TextBox進行聯動,非常不錯,今天我們嘗試RichTextBox +Panel相互聯動如下效果. 左側灰色為Panel,右側為RichTextBox 控制項 1:準備Pan ...
  • 最近,物聯網的概念比較熱門,一大批廠商搶著占領物聯網的高低,包括有華為物聯網、阿裡雲物聯網、騰訊物聯網、AWS物聯網等等,無法一一列舉,一般物聯網包含設備側開發、平臺側開發、應用側開發,三個部分構成了線上線下的完整連接,和我們常規的微信應用、釘釘應用等不同,物聯網的終端是由各種各樣的設備組合而成,這... ...
  • 加入NLog 按照官網的文檔 https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-2 一步一步操作下來,即可設置好。 配置文件的設置參考 http://www.makaidong.com/%E5%8D%9A%E5%A ...
  • 場景 FastReport安裝包下載、安裝、去除使用限制以及工具箱中添加控制項: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100893794 Winform中使用FastReport實現簡單的自定義PDF導出: https:/ ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...