責任鏈模式的具體應用

来源:https://www.cnblogs.com/DreamOfLife/archive/2018/04/01/8688810.html
-Advertisement-
Play Games

1.業務場景 生產車間中使用的條碼掃描,往往一把掃描槍需要掃描不同的條碼來處理不同的業務邏輯,比如,掃描投入料工位條碼、掃描投入料條碼、掃描產出工裝條碼等,每種類型的條碼位數是不一樣,因此通過條碼長度來進行業務區分。 2.初步設計 面對此場景,能夠想到的最簡單的設計就是使用if...else if. ...


1.業務場景

    生產車間中使用的條碼掃描,往往一把掃描槍需要掃描不同的條碼來處理不同的業務邏輯,比如,掃描投入料工位條碼、掃描投入料條碼、掃描產出工裝條碼等,每種類型的條碼位數是不一樣,因此通過條碼長度來進行業務區分。

2.初步設計

    面對此場景,能夠想到的最簡單的設計就是使用if...else if...或者swith進行判斷,因此,我們編寫的代碼如下

 1 switch(barCode.length)
 2 {
 3     case 3:
 4         DoSomething1();
 5         break;
 6     case 4:
 7         DoSomething2();
 8         break;
 9     case 5:
10         DoSomething3();
11         break;
12     default:
13         DoSomething4();
14         break;
15 }

 

    使用是if...else if...或者switch已經基本上滿足了需求,以後需要添加掃描場景,只需要增加判斷,完成對應的方法即可。

    作為一個程式員,僅僅滿足需求的話,往往降低了對自己的要求,同時,隨著掃描業務的增加,switch中的代碼逐漸增加,多到我們自己都覺得這段代碼讀起來就像是吃著前天剩下的硬饅頭一樣,難以下咽。

3.設計提升

上述場景完全可以使用設計模式中的責任鏈模式來進行優化,實施步驟如下:

3.1 定義處理結果

      一個處理在責任鏈上流動時,有兩種結果,一是不能處理,轉給其後繼者,二是可以處理,同時又引出兩種結果,處理成功和處理失敗。因此,對處理結果統一定義為枚舉類型

 1 public enum HandleResult
 2 {
 3   /// <summary>
 4    /// 成功
 5    /// </summary>
 6    Success=0,
 7    /// <summary>
 8    /// 失敗
 9    /// </summary>
10    Failed = 1,
11    /// <summary>
12    /// 未處理
13    /// </summary>
14    Unhandle = 2
15 }

 

3.2定義業務抽象類AbstractBarCodeHandler

    定義業務抽象類,包含一個屬性“Successor”,用於標記其後繼者,一個公共方法“HandleRequest”,當調用真正的業務處理方法時返回未處理,則調用其後繼者進行處理,一個抽象方法“HandleRequestCore”,每個掃描業務具體類,需要實現此方法,並對條碼進行處理。

 1     public abstract class AbstractBarCodeHandler
 2     {
 3         /// <summary>
 4         /// 責任處理的後繼者
 5         /// </summary>
 6         private AbstractBarCodeHandler mSuccessor;
 7 
 8         /// <summary>
 9         /// 責任處理的後繼者
10         /// </summary>
11         public AbstractBarCodeHandler Successor
12         {
13             get
14             {
15                 return mSuccessor;
16             }
17 
18             set
19             {
20                 mSuccessor = value;
21             }
22         }
23 
24         /// <summary>
25         /// 請求處理方法
26         /// </summary>
27         public HandleResult HandleRequest(string barCode)
28         {
29             var result = HandleRequestCore(barCode);
30             if (result == HandleResult.Unhandle)
31             {
32                 if (Successor != null)
33                 {
34                     Successor.HandleRequest(barCode);
35                 }
36                 else
37                 {
38                     Console.WriteLine($"The BarCode:{barCode} do not handle.");
39                 }
40             }
41             return result;
42         }
43 
44         protected abstract HandleResult HandleRequestCore(string barCode);
45     }

 

 

3.3定義業務實現具體類

     每個具體的條碼掃描業務,都定義一個類,繼承自AbstractBarCodeHandler,並實現其抽象方法,比如,

  LocationBarCodeHandler:工位條碼處理類
  LocationInBarCodeHandler:入庫條碼處理類
  LocationOutBarCodeHandler:出庫條碼處理類
  MaterialBarCodeHandler:物料條碼處理類
  ToolingBarCodeHandler:工裝條碼處理類

3.4 生成責任鏈

    依次對每個類進行初始化,並設置其後繼者,比如:

  工位條碼處理類實例.Successor=入庫條碼處理類實例;
  入庫條碼處理類實例.Successor=出庫條碼處理類實例;
  出庫條碼處理類實例.Successor=物料條碼處理類實例;
  物料條碼處理類實例.Successor=工裝條碼處理類實例;

3.5處理過程

     當條碼槍掃描一個條碼,便發起了一個處理請求,該請求在責任鏈上依次流動(工位->入庫->出庫->物料->工裝),若某個節點不能夠處理,則需要交接去後繼者,若能夠處理,則返回處理結果,當所有的節點都無法處理,需要給出對應的提示。

 

二〇一八年四月一日 


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

-Advertisement-
Play Games
更多相關文章
  • 動態庫後續補充, 本身內容有點多, 這裡簡單分享一下. 希望有魚漁 : ) ...
  • 在日常 python 開發過程中,瞭解一些常用工具很有必要。例如pip,pydoc等 pip pydoc 1、pip 安裝Module 從python 2.7.9 之後,引入了pip工具,用於安裝module。 基本使用: 如果你的Python還沒有安裝pip,可以先通過下麵命令安裝pip: pyt ...
  • 一、Redis的安裝 xshell連上伺服器,依次輸入以下代碼: 如果不巧發生以下截圖中的錯誤: 說明未安裝gcc,如果是centos系統,輸入:yum install gcc安裝gcc即可,然後再次輸入make執行。 輸入make後,很不幸,再次發生如下截圖錯誤: 推測是因為編譯庫的問題。 將ma ...
  • 第二章、線性表 一、線性表的順序表示和實現 1、線性表中第i個數據元素ai的存儲位置: LOC(ai)=LOC(a1)+(i-1)*l l為每個元素需占用l個單元 2、有上式可知,線性表的順序結構是一種隨機存取的存儲結構,但其缺點為插入和刪除比較困難。 3、線性表的數據結構表示為: // 線性表的動 ...
  • 前言 從今天開始進入Java基礎的複習,可能一個星期會有一篇的,我寫博文的未必都是正確的~如果有寫錯的地方請大家多多包涵並指正~ 今天要複習的是泛型,泛型在Java中也是個很重要的知識點,本文主要講解基礎的概念,並不是高深的知識,如果基礎好的同學可以當複習看看~ 一、什麼是泛型? Java泛型設計原 ...
  • 將數據處理移植到STM32上,採用串口的DMA接收模式,註意的是DMA_MODE採用Circular,DMA_BufferSize>(8*512+36=4132)(小包8個位元組,每秒512個,完整的大包36個位元組) 代碼如下: //////////////////////////////////// ...
  • 概述 New UWP Community Toolkit V2.2.0 的版本發佈日誌中提到了 RadialGauge 的調整,本篇我們結合代碼詳細講解 RadialGauge 的實現。 RadialGauge 是一種徑向儀錶盤控制項,使用圓盤面上的指針來顯示一定範圍的值,這種顯示和交互方式,讓數據可 ...
  • 在14,15年間帶領幾個不同的團隊,交付了幾個項目,在這個過程中,雖然幾個項目的業務不一樣,但是很多應用程式架構基礎性的功能卻是大同小異,例如認證、授權、請求驗證、異常處理、DTO、日誌、審計、定時任務、調度、多語言、應用配置管理等等這些功能。但是由於項目受限於進度、資源、團隊成員的背景,在當時卻難 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...