Swift中的设计模式:责任链模式

欢迎来到一系列致力于学习设计模式的文章。 尽管许多想法与代码无关,但我们的目标是向您展示如何在Swift中实现它们(在撰写本文时为Swift 3.0)。 每个帖子彼此独立,所有项目代码都可以 在Git上找到

这是其中一种更为自我描述的设计模式。 责任链设计模式允许一连串不同的对象(从相同的类/接口继承),将执行一段逻辑的职责传递给另一个对象。

在此示例中,我们将使用一名需要支付费用的员工,而该费用需要他们结清。 在我们的示例业务中,他们有几种选择可以清除这笔费用。

雇员

员工可以清除0至100英镑之间的所有费用。

老板

如果员工的支出大于此 ,则可以与老板联系,后者有能力结清101-1000英镑之间的费用。

首席执行官

除此之外,员工还需要与公司的首席执行官联系,后者对任何费用都严格限制了10,000英镑的费用。 其他任何事情都可能不会得到公司的批准。

如您所见,这形成了自然的“链”:

在我们的代码中,CEO,老板和员工是同一链的一部分,因此它们将实现相同的接口。 如果他们不能批准费用,他们将有能力将责任推上链。 用于此的UML如下所示:

首先,在Xcode中创建一个新项目。 我们不会在UIKit中碰任何东西,因此创建一个macOS Terminal项目。

首先创建一个Expenditure类。 这是一个简单的类,将仅容纳我们的费用。 在现实生活中,这可能包含更多相关信息。 代码如下所示:

然后,我们将创建Chain协议。 该协议将能够沿着管理“链”传递责任。 它看起来像这样:

员工,老板和首席执行官都将实施此协议。 如果费用金额太大而他们无法批准,他们将把费用沿着链条传递。

CEO代码与其余代码略有不同。 您可能还记得,CEO只能接受少于10,000英镑的同意。 为了停止销售,我们检查金额是否超过10,000英镑,并进行打印以告知用户:

然后,在我们的主类中,我们将其链接在一起。 首先,我们需要这样创建员工,老板和CEO对象:

然后,我们在每个适用位置上调用setNextManagementLevel() 。 它看起来像这样:

然后,我们与员工展开连锁反应:

现在,您完整的main.swift文件将如下所示:

运行您的程序,您将在终端中看到以下输出:

  员工可以批准这笔支出 
你的老板可以批准这笔支出
首席执行官可以批准这笔支出
这项支出过大,不会获得批准
程序以退出代码结束:0

欢呼! 您已经实现了管理层次结构-我的意思是-责任链设计模式。 您可以在Git上找到所有与此相关的代码

山姆·斯通(@ Stonesam92)| 推特
Sam Stone(@ Stonesam92)的最新推文。 移动开发人员和嘻哈迷。 #iosdev #swiftlang #objC。 曼彻斯特… twitter.com