责任链模式

概念示例: 业务场景 一示例: 业务场景 二

概念

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,用于将一个任务连续传递给多个处理器直到被处理为止。在 Swift 中,可以使用类来实现责任链模式。

示例: 业务场景 一

我们可以实现一个处理销售订单的责任链,有以下三种处理器:

销售经理(SalesManager):处理订单金额范围在0到1000之间的订单。财务部门(FinanceDepartment):处理订单金额范围在1000到5000之间的订单。总经理(GeneralManager):处理订单金额超过5000的订单。

下面是 Swift 中责任链模式的实现:

protocol OrderHandler {

var next: OrderHandler? {get set}

func handleOrder(amount: Double)

}

class SalesManager: OrderHandler {

var next: OrderHandler?

func handleOrder(amount: Double) {

if amount < 100 {

print("小职员 可以已经处理 价值 \(amount) 的货物")

} else {

next?.handleOrder(amount: amount)

}

}

}

class FinanceDepartment: OrderHandler {

var next: OrderHandler?

func handleOrder(amount: Double) {

if amount < 1000 {

print("财务总监 可以已经处理 价值 \(amount) 的货物")

} else {

next?.handleOrder(amount: amount)

}

}

}

class GeneralManager: OrderHandler {

var next: OrderHandler?

func handleOrder(amount: Double) {

if amount < 10000 {

print("总经理 可以已经处理 价值 \(amount) 的货物")

} else {

print("没有人能处理这个 货物")

}

}

}

调用方式

let salesManager = SalesManager()

let financeDepartment = FinanceDepartment()

let generalManager = GeneralManager()

salesManager.next = financeDepartment

financeDepartment.next = generalManager

generalManager.next = nil

financeDepartment.handleOrder(amount: 100.0)

financeDepartment.handleOrder(amount: 20000.0)

在上面的代码中,我们定义了一个 OrderHandler 协议,该协议包含一个 handleOrder(amount:) 方法和一个可选属性 next,用于构建责任链。对于每个订单,可以逐一调用责任链上的每个处理器,直到订单得到处理为止。

客户端操作如下:

创建销售经理(SalesManager)、财务部门(FinanceDepartment)和总经理(GeneralManager)对象,并设置下一个处理器。调用销售经理处理订单的方法。根据订单金额,逐一调用责任链上的处理器,直到找到能够处理该订单的处理器为止。

示例: 业务场景 二

以处理用户登录的示例为例 我们将创建一个基于责任链模式的用户登录过程,其涉及以下步骤:

判断用户名是否存在。判断用户密码是否正确。是否启用了双重验证或两步验证。是否已通过所有安全检查,允许用户登录。

如果某个步骤未成功完成,则不会执行后续步骤。

实现如下:

// 处理用户请求的责任链

protocol LoginHandler {

var next: LoginHandler? { get set }

func handle(request: LoginRequest)

}

// 用户登录请求

struct LoginRequest {

let username: String

let password: String

var isTwoFactorAuthEnabled: Bool = false

var isSecurityCheckPassed: Bool = false

}

// 判断用户名是否存在的处理器

class CheckUsernameHandler: LoginHandler {

var next: LoginHandler?

func handle(request: LoginRequest) {

if request.username.count == 0 {

print("用户名不能为空")

} else {

next?.handle(request: request)

}

}

}

// 判断用户密码是否正确的处理器

class CheckPasswordHandler: LoginHandler {

var next: LoginHandler?

func handle(request: LoginRequest) {

if request.password.count == 0 {

print("密码不能为空")

} else {

next?.handle(request: request)

}

}

}

// 双重验证或两步验证处理器

class TwoFactorAuthHandler: LoginHandler {

var next: LoginHandler?

func handle(request: LoginRequest) {

if request.isTwoFactorAuthEnabled {

print("请通过双重验证或两步验证")

} else {

next?.handle(request: request)

}

}

}

// 安全检测处理器

class SecurityCheckHandler: LoginHandler {

var next: LoginHandler?

func handle(request: LoginRequest) {

if request.isSecurityCheckPassed {

print("登录成功")

} else {

print("安全检测未通过,请联系管理员")

}

}

}

调用方式

let checkUsernameHandler = CheckUsernameHandler()

let checkPasswordHandler = CheckPasswordHandler()

let twoFactorAuthHandler = TwoFactorAuthHandler()

let securityCheckHandler = SecurityCheckHandler()

checkUsernameHandler.next = checkPasswordHandler

checkPasswordHandler.next = twoFactorAuthHandler

twoFactorAuthHandler.next = securityCheckHandler

let request1 = LoginRequest(username: "test", password: "", isTwoFactorAuthEnabled: false, isSecurityCheckPassed: false)

checkUsernameHandler.handle(request: request1)

let request2 = LoginRequest(username: "test", password: "test123", isTwoFactorAuthEnabled: true, isSecurityCheckPassed: false)

checkUsernameHandler.handle(request: request2)

let request3 = LoginRequest(username: "test", password: "test123", isTwoFactorAuthEnabled: false, isSecurityCheckPassed: true)

checkUsernameHandler.handle(request: request3)

在上述代码中,我们首先定义了 LoginHandler 责任链模式,然后连续添加了四个处理器,用于检查用户名、密码、双重验证或两步验证,以及安全检查。如果给定的登录请求未通过任何一项,则停止责任链。

客户端调用的示例代码如下所示:

创建 LoginRequest 对象,并在创建 CheckUsernameHandler 处理器后调用 handle(request:) 方法,开始责任链流程。逐一调用责任链上的每个处理器,直到找到能够处理该请求的处理器为止。如果未通过任何一项,则停止责任链。

输出结果如下:

密码不能为空 请通过双重验证或两步验证 登录成功

这个例子简单演示了如何在 Swift 中使用责任链模式处理流程。

相关文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: