神碼ai智能寫作網(wǎng)站百度怎么發(fā)帖做推廣
文章目錄
- 現(xiàn)實實例
- 反例
- 優(yōu)化
- 異步職責鏈
職責鏈模式在 C# 中是常見的,他的定義是:使多個對象都有機會處理請求,從而避免發(fā)送者和請求者之間的耦合關系,將對象連成一條鏈并傳遞該請求,直到有一個對象處理它為止
現(xiàn)實實例
上公交車要把硬幣遞給后排的售票員(現(xiàn)在應該不常見了)運氣好第一個人就是售票員,負責要一直傳遞直到找到售票員
請求發(fā)送者只知道鏈中的第一個節(jié)點,弱化了發(fā)送者和接受者之間的強聯(lián)系,如果不使用職責鏈模式,我們只能知道誰是售票員,才能把硬幣給他
反例
假設你正在開發(fā)一個在線購物網(wǎng)站,其中有一個訂單處理系統(tǒng)。在該系統(tǒng)中,訂單需要經(jīng)過一系列的驗證和處理步驟,包括庫存檢查、支付驗證、優(yōu)惠券驗證和物流處理
如果是一個程序員新手他有可能實現(xiàn)這樣的代碼,每個步驟都硬編碼在里面,難以擴展和優(yōu)化:
public class OrderProcessor
{public void ProcessOrder(Order order){// 庫存檢查bool stockAvailable = CheckStock(order);if (!stockAvailable){Console.WriteLine("庫存不足");return;}// 支付驗證bool paymentValidated = ValidatePayment(order);if (!paymentValidated){Console.WriteLine("支付驗證失敗");return;}// 優(yōu)惠券驗證bool couponValidated = ValidateCoupon(order);if (!couponValidated){Console.WriteLine("優(yōu)惠券驗證失敗");return;}// 物流處理ProcessShipping(order);}private bool CheckStock(Order order){// 檢查庫存邏輯// ...}private bool ValidatePayment(Order order){// 支付驗證邏輯// ...}private bool ValidateCoupon(Order order){// 優(yōu)惠券驗證邏輯// ...}private void ProcessShipping(Order order){// 物流處理邏輯// ...}
}public class Order
{// 訂單數(shù)據(jù)// ...
}
優(yōu)化
這是使用職責鏈模式優(yōu)化的代碼,把請求解耦分給不同的 Handler 執(zhí)行,并通過設置 Next Handler 找到下一個職責任務,這就拆分了不同的執(zhí)行節(jié)點,變得可擴展了
public abstract class OrderHandler
{protected OrderHandler NextHandler;public void SetNextHandler(OrderHandler handler){NextHandler = handler;}public abstract void ProcessOrder(Order order);
}public class StockCheckHandler : OrderHandler
{public override void ProcessOrder(Order order){bool stockAvailable = CheckStock(order);if (!stockAvailable){Console.WriteLine("庫存不足");return;}if (NextHandler != null){NextHandler.ProcessOrder(order);}}private bool CheckStock(Order order){// 檢查庫存邏輯// ...}
}public class PaymentValidationHandler : OrderHandler
{public override void ProcessOrder(Order order){bool paymentValidated = ValidatePayment(order);if (!paymentValidated){Console.WriteLine("支付驗證失敗");return;}if (NextHandler != null){NextHandler.ProcessOrder(order);}}private bool ValidatePayment(Order order){// 支付驗證邏輯// ...}
}public class CouponValidationHandler : OrderHandler
{public override void ProcessOrder(Order order){bool couponValidated = ValidateCoupon(order);if (!couponValidated){Console.WriteLine("優(yōu)惠券驗證失敗");return;}if (NextHandler != null){NextHandler.ProcessOrder(order);}}private bool ValidateCoupon(Order order){// 優(yōu)惠券驗證邏輯// ...}
}public class ShippingHandler : OrderHandler
{public override void ProcessOrder(Order order){// 物流處理邏輯// ...}
}// 在客戶端代碼中構建職責鏈
public class Client
{public void Main(){OrderHandler stockCheckHandler = new StockCheckHandler();OrderHandler paymentValidationHandler = new PaymentValidationHandler();OrderHandler couponValidationHandler = new CouponValidationHandler();OrderHandler shippingHandler = new ShippingHandler();stockCheckHandler.SetNextHandler(paymentValidationHandler);paymentValidationHandler.SetNextHandler(couponValidationHandler);couponValidationHandler.SetNextHandler(shippingHandler);OrderProcessor orderProcessor = new OrderProcessor(stockCheckHandler);Order order = new Order();orderProcessor.ProcessOrder(order);}
}public class OrderProcessor
{private OrderHandler _orderHandler;public OrderProcessor(OrderHandler orderHandler){_orderHandler = orderHandler;}public void ProcessOrder(Order order){_orderHandler.ProcessOrder(order);}
}public class Order
{// 訂單數(shù)據(jù)// ...
}
異步職責鏈
每個具體的處理器類都可以異步執(zhí)行相應的任務,并將結(jié)果傳遞給下一個處理器。通過使用異步職責鏈模式,將注冊過程的不同步驟解耦并異步處理,提高性能和響應速度
public abstract class RegistrationHandler
{protected RegistrationHandler NextHandler;public void SetNextHandler(RegistrationHandler handler){NextHandler = handler;}public abstract Task<bool> ProcessAsync(RegistrationRequest request);
}public class UsernameValidationHandler : RegistrationHandler
{public override async Task<bool> ProcessAsync(RegistrationRequest request){// 驗證用戶名是否有效await Task.Delay(1000); // 模擬異步操作bool isValid = !string.IsNullOrEmpty(request.Username);Console.WriteLine("Username validation completed");// 將結(jié)果傳遞給下一個處理器if (NextHandler != null){return await NextHandler.ProcessAsync(request) && isValid;}return isValid;}
}public class EmailValidationHandler : RegistrationHandler
{public override async Task<bool> ProcessAsync(RegistrationRequest request){// 驗證電子郵件是否有效await Task.Delay(1000); // 模擬異步操作bool isValid = !string.IsNullOrEmpty(request.Email);Console.WriteLine("Email validation completed");// 將結(jié)果傳遞給下一個處理器if (NextHandler != null){return await NextHandler.ProcessAsync(request) && isValid;}return isValid;}
}public class AccountCreationHandler : RegistrationHandler
{public override async Task<bool> ProcessAsync(RegistrationRequest request){// 創(chuàng)建用戶賬戶await Task.Delay(1000); // 模擬異步操作bool isSuccess = true; // 假設賬戶創(chuàng)建成功Console.WriteLine("Account creation completed");// 將結(jié)果傳遞給下一個處理器if (NextHandler != null){return await NextHandler.ProcessAsync(request) && isSuccess;}return isSuccess;}
}