首页 > Windows开发 > 详细

C#/.Net core中的职责链模式

时间:2020-07-12 18:28:22      阅读:106      评论:0      收藏:0      [点我收藏+]

我有个朋友最近第一次研究了经典的“Gang Of Four”  设计模式书籍。他随手就问我哪些设计模式我在我的商业程序中用到了,实际上他的想法是:“此刻我正在用这些设计模式”。单例,工厂模式,中介者模式,我已经使用过所有这些设计模式并且之前写过关于它们的内容。但是之前我从没有讨论过的模式是职责链模式。

什么是“职责链模式”?

职责链(有时候我会称之为命令链)模式是一种设计模式,其允许对一个对象的处理在层级顺序下进行,经典的维基百科定义如下:

在面向对象设计中,责任链模式是一种由命令对象源和一系列处理对象组成的设计模式。每一个处理对象都会包含定义了其所能处理的命令对象类型的逻辑;其余的便会传递到链条中的下一个处理对象。也存在让我们可以在链条的末尾添加自己的处理对象的机制。因此,职责链模式是  if … else if … else if ……. else … endif 的面向对象的版本,其可以带来的益处便是 条件-动作处理单元可以在运行时动态的进行重新安排和配置。

维基百科的解释很可能听起来不是很有道理,让我们来看一看真实世界的例子,随后我们可以将其转化为代码。

让我们假设我有一个银行,在这个银行中我有三个级别的员工,一个银行出纳,一个监督员,一个银行主管。如果一个人进来要提取一些存款,银行出纳可以允许任何少于10000美元的提取,不会问任何问题。如果取款金额超过10000美元,它便会被传给监督员进行处理。监督员可以处理上至100,000美元的请求,但必须要这个账户在记录中具有ID。如果ID没有在记录中,那么无论如何请求便会被拒绝。如果请求金额达到了 100,000美元,其便会流转到银行主管。银行主管可以审批任何金额的提取即使ID并不在记录中,因为如果他们提取那个金额,他们便是VIP并且我们不会在乎洗钱规则。

这便是我们之前讨论的层级链,其中每个人都尝试处理这个请求,并且能够把请求传递给下一个处理人。如果我们采取这种实现并且将其映射为代码(以一种优雅的方式),这就是我们所称的职责链模式。但是在我们进行任何深入之前,让我们看看一个坏的解决此问题的方式。

一个不好的实现

让我们只是使用if/else来解决这整个问题

class BankAccount
{
    bool idOnRecord { get; set; }

    void WithdrawMoney(decimal amount)
    {
        // Handled by the teller. 
        if(amount < 10000)
        {
            Console.WriteLine("Amount withdrawn by teller");
        } 
        // Handled by supervisor
        else if (amount < 100000)
        {
            if(!idOnRecord)
            {
                throw new Exception("Account holder does not have ID on record.");
            }

            Console.WriteLine("Amount withdrawn by Supervisor");
        }
        else
        {
            Console.WriteLine("Amount withdrawn by Bank Manager");
        }
    }
}
看得出来我们的代码有一些问题:
  • 在这里添加额外层级的员工是很难管理的,其会导致if/else语句的混乱。
  • 在监督员级别检查ID的特殊逻辑是某种难以进行单元测试的东西,因为其首先需要传递一些其他的检查。
  • 当仅有的定义逻辑是当时提取的金额,我们可以在未来添加额外的检查(比如,VIP客户被如此标记并总是被监督员处理)。这个逻辑将会变得很难维护并很容易失控。

职责链模式代码

C#/.Net core中的职责链模式

原文:https://www.cnblogs.com/qianxingmu/p/13289023.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!