阅读 367

ios-责任链模式

使用处理请求的模式,它是让多个处理器都有机会处理该请求,知道其中某个处理成功为止,责任链模式把多个处理器串成链,然后让请求在链传递。如果当前的处理器无法处理则交给下一个处理器处理。

  • 定义一个抽象处理类
import Foundation

// 角色一: 抽象的处理对象
class Leader {
    
    var nextLeader: Leader? //下一个处理者
    //处理请求
    func handleBill(bill: ReimbursementBill) {
        //条件成立完成处理
        if self.getMaxMoneny() > bill.money {
            self.handle(bill: bill)
        }
        //否则交给下一个处理者处理事件
        else {
            self.nextLeader?.handleBill(bill: bill)
        }
    }
    //用函数返回这个处理者的最大处理能力
    func getMaxMoneny() -> Float {
        return 0
    }
    
    func handle(bill: ReimbursementBill) {
        
    }
}
复制代码
  • 客户端请求者
import Foundation

// 角色三: 抽象的请求角色
class ReimbursementBill {
    
    var name: String
    var money: Float
    
    init(name: String, money: Float) {
        self.name = name
        self.money = money
    }
}

复制代码
  • 具体处理者1
import Foundation

// 角色二: 具体角色 (组长)
class GroupLeader: Leader {
    
    override func getMaxMoneny() -> Float {
        return 1000
    }
    
    override func handle(bill: ReimbursementBill) {
        print("组长报销内容: \(bill.name) 报销金额: \(bill.money)")
    }
}
复制代码
  • 具体处理者2
import Foundation

class ChargeLeader: Leader {
    override func getMaxMoneny() -> Float {
        return 5000
    }
    
    override func handle(bill: ReimbursementBill) {
        print("主管报销内容: \(bill.name) 报销金额: \(bill.money)")
    }
}
复制代码
  • 具体处理者3
import Foundation

class CEOLeader: Leader {
    override func getMaxMoneny() -> Float {
        return 10000
    }
    
    override func handle(bill: ReimbursementBill) {
        print("老板报销内容: \(bill.name) 报销金额: \(bill.money)")
    }
}
复制代码
  • 调用
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        let group = GroupLeader()
        let charge = ChargeLeader()
        let ceo = CEOLeader()
        
        group.nextLeader = charge
        charge.nextLeader = ceo
        
        let bill = ReimbursementBill(name: "Mac 电脑", money: 6780)
        group.handleBill(bill: bill)
    }
}
复制代码
  • 结果:老板报销内容: Mac 电脑 报销金额: 6780.0

  • 项目中的具体使用可以是其他场景

可参考这篇文章

文章分类
iOS
文章标签