Skip to main content

Chain of Responsibility Pattern

Chain of Responsibility Pattern用途
Chain of Responsibility Pattern類似一個結構化的switch,輸入若不符合條件就會給下一個case處理。

Chain of Responsibility Pattern實作結構

基本所需的結構有upSendData、SetUpSendData、Processor三個。
upSendData:主要是記錄下一個Processor所處裡的資料。
SetUpSendData:用來設定紀錄upSendData的資料,也就是結構連結下一個處理資料的設定。
Processor:主要執行目前的結構要處理的事情。
Chain of Responsibility Pattern設計概念
1.Processor設計:需要有一個判斷是否可以被當下Processor處理的規則,若不符合此規則會檢查是否還有下一個檢查項目,若已經是最後一個檢查項目,則作沒有符合項目的處理,若有下一個檢查項目會call下一個檢查項目的Processor繼續做下去。(如下範例)

public override void Processor(input)
{
if (判斷條件)
{
...
}
else
{
if (null != upSendData)
upSendData.Processor(input);
}
}

2.SetUpSendData和upSendData設計:SetUpSendData和upSendData基本上是固定的寫法,SetUpSendData用來設定下一個檢查項目的upSendData讓upSendData.Processor可以往下串接。(如下範例)

protected SendDataHandler upSendData;
public void SetUpSendData(SendDataHandler upSendData)
{
this.upSendData = upSendData;
}

abstract class SendDataHandler
{
protected Dictionary<string, string> D;
protected SendDataHandler upSendData;
public SendDataHandler(string tagstr)
{
D = new Dictionary<string, string>();
string[] ss = tagstr.Split(';');
string[] tmp0 = ss[0].Split(',');
string[] tmp1 = ss[1].Split(',');
for (int i = 0; i < tmp0.Count(); i++)
D.Add(tmp0[i],tmp1[i]);
}
public void SetUpSendData(SendDataHandler upSendData)
{
this.upSendData = upSendData;
}
abstract public void Processor(object key, object value, ref object Out);
}

 
說明:範例要做一個把某些關鍵字A對應成為B字串,D變數用於存取A字串和B字串的對應,SendDataHandler用於初始化D變數資料,SetUpSendData用於設定upSendData串接的資料,Processor主要處理A字串的某些關鍵字改為B字串的功能以及判斷是否符合要處理的資料。

class ToServerCommonClass : SendDataHandler
{
public ToServerCommonClass(string tagstr) : base(tagstr) { }
public override void Processor(object key, object value, ref object Out)
{
string _key = key.ToString();
if (D.ContainsKey(_key)) {
string _value = ((IDictionary<string, string>)value)[_key];
if (string.IsNullOrWhiteSpace(_value)) return;
((List)Out).Add(D[_key] + "=" + _value);
}
else
{
if (null != upSendData)
upSendData.Processor(key, value,ref Out);
}
}
}

說明:如果D變數裡面有符合輸入的關鍵字,且輸入的value變數找的到該關鍵字的對應資料,就將字串組合後輸出,若value變數沒有找到關鍵字的對應資料就不做處理,另外如前面所提到的若D對應表沒有找到此輸入所對應的字串,則程式會去找是否有下一個Processor可以處理,在此範例中,若找不到下一個Processor處理時,就不處理了。


class ToServerResponseClass : SendDataHandler
{
public ToServerResponseClass(string tagstr) : base(tagstr) { }
public override void Processor(object key, object value, ref object Out)
{
string _key = key.ToString();
//string _value = value.ToString();
if (D.ContainsKey(_key)) {
string _value = ((IDictionary)value)[_key];
if (string.IsNullOrWhiteSpace(_value)) return;
((List)Out).Add(D[_key] + "=" + _value);
((List)Out).Add("Q=P");
}
else
{
if (null != upSendData)
upSendData.Processor(key, value,ref Out);
}
}
}
說明:大致跟上一段code一樣,差別在處理字串輸出多了一個”Q=P”字串,讓string list裡面多了一筆資料。

ToServerCommonClass CC = new ToServerCommonClass("NAS,BBB,CCC;About iTe2,QQQ,RRR");
ToServerResponseClass RC = new ToServerResponseClass("網路儲存伺服器;關於詮力");
public static void Main(string[] args)
{
CC.SetUpSendData(RC);
string[] StrA = {"NAS","網路儲存伺服器"};
List bj = new List(20);
object bjtmp = bj;
foreach(string i in StrA)
CC.Processor(i, "VVV", ref bjtmp);
bj = (List)bjtmp;
}
說明:一開始先宣告CC、RC兩個處理類別,並且初始化這兩個類別能夠處理的字串對應表,然後程式進入的時候將CC處理類別與RC處理類別串起來,這樣CC處理類別無法處裡的時候就會給RC處理類別處理了,接下來在宣告一個字串陣列StrA,裡面有兩個字串,剛好一個可以給CC類別處理,一個可以給RC類別處理,然後開始處理字串,迴圈第一圈輸入的key=”NAS”,value=”VVV”所以CC類別處理結果為bjtmp加入字串”About iTe2=VVV”,接下來迴圈第二圈輸入的key=”網路儲存伺服器”,value=”VVV”因為CC類別不能處理,所以輸入值會向下一個處理丟,丟給RC類別處理,RC類別可以處理”網路儲存伺服器”字串,所以bjtmp加入字串”關於詮力=VVV”和”Q=P”兩字串,接下來跳出迴圈後將物件bjtmp轉給bj string list結束程式。
結語:Chain of Responsibility Pattern其實算滿常可以使用的一種寫程式的方法,不過有個小缺點就是會比一般的if方法或是switch方法處理起來還要慢,但是優點是方便管理、模組化、變化性高…等等優點,但是相對的,設計的時間成本也相對較多且開發起來較複雜,需不需要用到Chain of Responsibility Pattern我覺得還是要看狀況使用,而不是都改成Chain of Responsibility Pattern的方式就是最好的方法。

Comments

Popular posts from this blog

免寫程式、免安裝程式,也能使用Web API發送監控簡訊

話說詮力新版的簡訊發送平台提供了Web API功能,使用者可申請帳號後,依照API的規格文件開發,即可替自己的系統增加透過API發簡訊的功能。因本文章的主題並不是介紹該API,故僅就使用到的基本參數做介紹,就不詳述如何呼叫該API了。 首先,請使用Http POST Method,呼叫簡訊發送平台的Url,並帶入下列參數,若順利呼叫成功,回傳內容會取得一個Json物件,其中ErrorCode的值若為0,即表示已成功將發送簡訊的需求送至簡訊平台。 Web API傳入參數 Web API回傳內容 接著進入本文主題,利用Windows系統中內建強大的PowerShell功能,就可以輕鬆做到不用寫程式,也不用安裝程式,就能做到監控Windows系統,有異常時自動發送簡訊。 1.打開Windows的事件檢視器,選取一個要監控的事件,本文選擇了IIS Start的事件: 2.撰寫Powershell的批次檔(.ps1檔),並放在想要存放的路徑,本文中的批次檔路徑為D:\final.ps1 (註:可先以記事本編輯好內容,再修改副檔名為ps1) for ($i = 0; $i -lt $Args.Count;) { $msg += $Args[$i] + " " $i++ } Add-Type -AssemblyName System.Web $EncodeMsg = [System.Web.HttpUtility]::UrlEncode($msg) $postParams = "UID=簡訊系統平台帳號&PWD=Base64編碼後的密碼&DA=09XXXOOOVV&SM=" + $EncodeMsg $response = Invoke-RestMethod -Uri http://簡訊系統平台Url/Sms/SendSms -Method POST -Body $postParams $response.ErrorCode 本批次檔的說明如下: Line 1~Line 5:將接收到的參數組合起來做為簡訊內容 Line 6~Line 7:將簡訊內容做urlencode,免得收到簡訊時是亂碼 Line 8:組合Web AP

[ 簡訊行銷 ] 雙向簡訊 與 行銷運用

還在以為行銷簡訊只能做單方面的訊息傳遞而感到單調無趣嗎?那你一定是還不認識「 雙向簡訊 」。到底什麼是「 雙向簡訊 」呢?簡單來說就是”有來” “有往”、有互動功能的簡訊發送。 下面就簡單介紹一下「 雙向簡訊 」的操作流程吧! 設定活動區間 為這次的雙向活動訂下活動時間,讓你在活動截止時間內所有回覆訊息不漏接。 設定回覆訊息 針對收訊者回覆的訊息內容設定「回覆訊息」,供簡訊系統在收到回覆的訊息後作自動傳送。 設定發送名單、簡訊內容 收到簡訊後回覆「1」,立即可得到剛剛設定好的第二則「回覆訊息」 發訊方可至簡訊平台報表中查詢所有收到的回覆訊息 「 雙向簡訊 」擁有以下特色 ★ 發訊號碼專用 雙向簡訊的發訊號碼是採用「特碼」方式,在活動時間內特碼專屬不與他人共用。 ★ 收訊與訊息反饋的對象彈性 收訊對象的選擇上,由於特碼在接收反饋的對象上並沒有限制必需在原始收訊名單內,因此您可善用各種能提高活動與號碼可見度的推廣平台,並不會侷限於僅能使用簡訊方式推廣。 ★ 訊息反饋立即且方便 電信業者提供收訊者回傳的訊息,經簡訊系統接收後進行訊息內容的分析與比對,再自動回傳相對應的「回覆訊息」給收訊者。簡訊平台也會將接收到的回傳訊息內容以報表方式呈現,供發訊方作進一步的分析依據。 回到在行銷活動上的運用,「雙向簡訊」的優點在於發訊方(以下統稱「業主」)可即時的得知客戶對產品或活動的回應。透過一發一答的簡訊活動得到的反饋資料,幫助業主對目標市場需求的了解、掌握潛在客戶的意見,收集到的反饋也能再作進一步的資訊分析。因此設計出吸引收訊者目光的行銷活動內容將會是個有趣的挑戰。愈能成功引起收訊者興趣,得到的訊息反饋自然也就愈多囉! 在行銷活動的陌生開發方面,「雙向簡訊」也能運用在資料庫行銷簡訊上。業主可依自家商品屬性,以地區、競業代表號、消費類型、目標客戶收入…等條件,透過電信業者或行銷公司的資料庫進行資料探勘 (Data Mining),篩選出自家商品的潛在客戶層,作為行銷活動的發送對象。由於門號屬於個資,業主並不會實質的拿到發送名單,這時如果運用於雙向簡訊的發送,就能透過收訊者回傳的訊息反饋,間接獲得對自家商品有興趣、強而有力的TA (目標客戶,Target A

簡訊 發送首選 – 詮力科技 簡訊廣播站

各大企業、銀行愛用之 簡訊 品牌 提供即時、穩定、安全之發送平台 第一次接觸 簡訊 嗎? 沒關係!透過影片立刻了解 簡訊 及 簡訊行銷 了解詳情 我們的服務項目 長簡訊 Long SMS 圖片 簡訊 MMS 大量簡訊 Bulk SMS 客製化簡訊 雙向簡訊 LBS 簡訊 API 簡訊 FTP 簡訊 SMPP 簡訊 我們的優勢  1 與銀行交易量 業界最多  2 數十家企業品牌 合作首選 3 每小時可乘載百萬則簡訊 系統穩定性高   4 TLS 機制、IP 鎖定機制 資安最嚴謹   5 兩家電信業自動備援 發送不中斷   6 微軟金級認證夥伴 技術保證  企業簡訊 王道首選 詮力 獨家服務  – 客戶端機房可直接串接至電信端 ◇ 業界中最安全, 完全符合個資法 要求 ◇ 系統功能完善, 滿足各種簡訊發送 需求 ◇ 可搭配專案,配置 客戶專屬電信門號 立即使用 詮力科技簡訊發送服務 我要發送  文字、長簡訊 前往簡訊廣播站 註冊 免費 送50點   我要發送  其他類型簡訊 我要  開發新客戶 撥打客服專線 or 填寫線上表單 【文章資料參考來源】 詮力科技 : https://www.ite2.com 簡訊廣播站 : https://www.ite2.com ITE2 NAS: https://www.ite2nas.com