美文网首页
责任链模式

责任链模式

作者: 一毛钱 | 来源:发表于2019-03-27 07:31 被阅读0次

    责任链模式-定义?

    第一点:使多个对象有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。
    第二点:将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

    责任链模式-应用场景

    多个对象同时处理同一请求,但是由哪个对象处理那么在运行的时候决定。

    责任链模式-角色划分?

    角色一:抽象处理对象->Handler
    两个特点
    第一个:声明一个处理方法
    第二个:保持一个对下一个处理节点的对象引用
    角色二:具体处理对象->OneHandler、TwoHandler
    在条件满足的情况下,处理对相应的请求操作

    责任链模式-原理案例

    结构->结束,只有没有结束继续往下传递,指导终止为止UIView->UIImageView->UIImageView。

    责任链模式 案例

    例如:
    项目组长->签字报销金额->5000以内
    项目主管->签字报销金额->100000以内
    公司老板->签字报销金额->10万以上
    第一个角色:抽象处理类->Leader(领导类)
    第二个角色:报销单
    第三个角色:项目组长
    第四个角色:项目主管
    第五个角色:公司老板

    代码如下:

    角色一:抽象处理类->Leader(领导类)(可以定义成协议,也可以定义成基类)

    class Leader: NSObject {
    
        var nextHandler:Leader?
        //划分等级(如果是否一个等级,那么我进行传递)
        final func handlerRequest(account:ExpenseAccount) {
            if self.limit() > account.money {
                //只想当前对象处理逻辑
                //我的签字批改金额 > 报销金额,那么我是可以签字
                handler(account: account)
            } else {
                if self.nextHandler != nil {
                    self.nextHandler?.handlerRequest(account: account)
                } else {
                    print("没有需要执行的处理请求...")
                }
            }
        }
        //职位
        func jobName() -> String {
            return ""
        }
        //审核额度
        func limit() -> Float {
            return 0
        }
        func handler(account:ExpenseAccount) { 
        }
    }
    

    处理事件的内容

    class ExpenseAccount: NSObject {
        //报销单金额
        var money:Float
        //报销单项目
        var title:String
        //报销单内容
        var content:String
        
        init(money:Float, title:String, content:String) {
            self.money = money
            self.title = title
            self.content = content
        }
    }
    

    角色二: 具体请求者 一

    class LeaderGroup: Leader {
    
        override func limit() -> Float {
            return 5000
        }
        
        override func jobName() -> String {
            return "组长"
        }
        
        override func handler(account: ExpenseAccount) {
            print("\(jobName())签字报销")
            print("报销项目: \(account.title),  报销内容: \(account.content),  报销金额:  \(account.money)")
        }
    }
    

    角色二:具体请求者二

    class LeaderManager: Leader {
    
        override func limit() -> Float {
            return 100000
        }
        
        override func jobName() -> String {
            return "主管"
        }
        
        override func handler(account: ExpenseAccount) {
            print("\(jobName())签字报销")
            print("报销项目: \(account.title),  报销内容: \(account.content),  报销金额:  \(account.money)")
        }
        
    }
    

    角色二:具体请求者三

    class LeaderCEO: Leader {
    
        override func limit() -> Float {
            return 100000000
        }
        
        override func jobName() -> String {
            return "CEO"
        }
        
        override func handler(account: ExpenseAccount) {
            print("\(jobName())签字报销")
            print("报销项目: \(account.title),  报销内容: \(account.content),  报销金额:  \(account.money)")
        }
    }
    

    外部调用

            let account = ExpenseAccount(money: 998, title: "公用报销", content: "外星人电脑顶配")
            let ceo = LeaderCEO()
            let manager = LeaderManager()
            let group = LeaderGroup()
            group.nextHandler = manager
            manager.nextHandler = ceo
            //组长审批
            group.handlerRequest(account: account)
    

    相关文章

      网友评论

          本文标题:责任链模式

          本文链接:https://www.haomeiwen.com/subject/lhcavqtx.html