我有个朋友最近第一次研究了经典的“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"); } } }
看得出来我们的代码有一些问题:
职责链模式代码
原文:https://www.cnblogs.com/qianxingmu/p/13289023.html