设计模式-(15)责任链模式 (swift版)

一,概念:

  责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

  主要解决职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

二,UML图:

  

  Handler定义一个处理请示的接口;

  ConcreteHandler具体处理者类,处理它所负责的请求,可访问它的后继者,如果可以处理该请求,就处理,否则就将该请求转发给它的后继者。

  Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。

最重要的两点,一个是你需要事先给每个具体管理者设置它的上司是哪个类,也就是设置后继者。另一点就是你需要在每个具体管理者处理请求时,做出判断,是可以处理这个请求,还是必须要“推卸责任”,转移给后继者去处理。

三,使用场景:

  1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

  2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

  3、可动态指定一组对象处理请求。

四,代码实例:

struct Leaving {
    var title: String
    var reasone: String
    var from: String
    var position: String
    var leaveDaysNum: Float

}
protocol Leader {
    var superior: Leader? {get set}

    var leaderPosition: String {get set}

    var controlLeavingDataTimeMix: Float {get set}
    var controlLeavingDataTimeMax: Float {get set}

    func handleLeaving(leaving: Leaving) -> Bool;
}

class CommonLeader: Leader {
    var superior: Leader?
    var leaderPosition: String
    var controlLeavingDataTimeMix: Float
    var controlLeavingDataTimeMax: Float

    init(superior: Leader?, position: String, mixTime: Float, maxTime: Float) {
        self.superior = superior
        leaderPosition = position
        controlLeavingDataTimeMax = maxTime
        controlLeavingDataTimeMix = mixTime
    }

}

extension Leader{
    func handleLeaving(leaving: Leaving) -> Bool {
        if leaving.leaveDaysNum >= controlLeavingDataTimeMix, leaving.leaveDaysNum <= controlLeavingDataTimeMax {
            print("I‘m \(leaderPosition), I agree!")
            return true
        }else if leaving.leaveDaysNum > controlLeavingDataTimeMax{
            if let superboss = superior{
                print("I‘m \(leaderPosition), Your leave longer than my control,i should ask my superior!")
                return superboss.handleLeaving(leaving: leaving)
            }else{
                print("I‘m \(leaderPosition), Your leave time is too long, I‘m against it")
                return false;
            }

        }else{
            print("I‘m \(leaderPosition), you have a problem with leaving time thus can‘t agree with you.")
            return false
        }
    }
}

class TeamLeader: CommonLeader {

    init(superior: Leader?) {
        super.init(superior: superior, position: "Team Leader", mixTime: 0.5, maxTime: 1.0)
    }
}

class DepartmentHead: CommonLeader {

    init(superior: Leader?) {
        super.init(superior: superior, position: "Department Head", mixTime: 1.5, maxTime: 7.0)
    }
}

class CompanyManager: CommonLeader {

    init(superior: Leader?) {
        super.init(superior: superior, position: "Company Manager", mixTime: 7.5, maxTime: 31.0)
    }
}
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let leaving = Leaving(title: "I‘d like to have paternity leave.", reasone: "My wife would have a baby in recent days.", from: "Ternence", position: "iOS engineer", leaveDaysNum: 15.0)

        let CM = CompanyManager(superior: nil)
        let DH = DepartmentHead(superior: CM)
        let TL = TeamLeader(superior: DH)

        print(TL.handleLeaving(leaving: leaving))
    }
}

  

原文地址:https://www.cnblogs.com/yangzigege/p/8969883.html

时间: 2024-08-28 17:55:26

设计模式-(15)责任链模式 (swift版)的相关文章

设计模式之责任链模式20170717

行为型设计模式之责任链模式: 一.含义 责任链模式的核心在"链"上,"链"是由多个处理者(对象)组成的,由这条链传递请求,直到有对象处理它为止(在链中决定谁来处理这个请求),并返回相应的结果 二.代码说明 1.主要有两个角色 1)处理者 它能够对请求做出处理(请求得到处理则直接返回,否则传到下一个处理者),设置下一个处理者(这两个操作可以抽象出来), 同时每个处理者都有一个相应的处理级别,以及具体的处理操作(父类实现请求传递,子类实现请求处理) 2)被处理者(请求者

【GOF23设计模式】责任链模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 1 package com.test.chainOfResp; 2 /** 3 * 封装请假的基本信息 4 */ 5 public class LeaveRequest { 6 private String empName; 7 private int leaveDays; 8 private String reason; 9 10 publi

职场小白初涉设计模式之责任链模式

最近,接到一个需求,在数据计算之前,根据需求的具体内容对数据进行过滤,保留下需要计算的那部分. 对于职场小白没经验的我来说,拿到需求,在确定于什么位置过滤数据以后,就开始义无反顾地码代码!! 怎么码呢?当然是建立需要过滤的接口及实现类,然后在里面进行过滤的具体操作. 由于过滤数据的两部分是对同一内容进行操作,于是在计算数据之前, 嗯,调用第一个实现类方法得到要过滤的内容,循环过滤数据,过滤第一部分: 再来调用第二个实现类方法得到要过滤的内容,循环过滤数据,过滤第二部分. 到这里,需求的功能性基本

设计模式之责任链模式--- Pattern chain-of-responsibility

模式的定义 责任链模式定义如下: Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it. 使多个对象都有机会处理请求,从而避免请求的发送

设计模式_责任链模式

定义 Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求.从而避免了请求的发送者和接受者之间的耦合关系.

Java设计模式之责任链模式、职责链模式

本文继续介绍23种设计模式系列之职责链模式. 什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组. 职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 角色 抽象处理者角色(Handler):定义出一个处理请求的接口.如果需要,接口可以定义 出一个方法以设定和返回对下家的引用.这个角色通常由一个Java抽象类或者Java接口实现. 具体处理者角色(ConcreteHan

Java设计模式应用——责任链模式

生产一个产品,需要依次执行多个步骤,才能完成,那么是使用责任链模式则是极好的. 在性能告警模块开发过程中,创建一条告警规则需要执行阈值解析,中间表生成,流任务生成,规则入库,告警事件入库等诸多操作.如果把这些步骤糅合在一个类中,代码可读性及复杂度往往是灾难的,特别对于这么多步骤的事务性操作,更是力不从心.使用责任链模式,上述问题迎刃而解. 以告警规则创建为例子,简化流程如下 阈值解析 ---> 流任务生成 ---> 规则入库 回滚流程如下 1. 阈值解析失败:回滚阈值解析. 2. 流任务生产失

C#设计模式:责任链模式

设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了,因为最近在设计“网关API”组件(后续介绍),采用“责任链设计模式”进行设计,所以先进行回顾记录.  一.责任链模式介绍 责任链模式是指一个处理需要涉及多个过程或者角色参与处理,并基于某个约定组成一个链,每个过程或者角色拥有各自职责进行处理.责任链模式有效组织一个过程处理,同时子过程之间职责明确.

Head First设计模式之责任链模式

一.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了. 何时使用:在处理消息的时候以过滤很多道. 如何解决:拦截的类都实现统一接口. 二.结构 从责任链模式的定义可以发现,责任链模式涉及的对象只有处理者角色,但由于有多个处理者,它们具有共同的处理请求的

23种设计模式之责任链模式(Chain of Responsibility)

责任链模式是一种对象的行为型模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止.责任链模式不保证每个请求都被接受,由于一个请求没有明确的接收者,那么就不能保证它一定会被处理. 优点: 1)降低了耦合度. 2)增加向对象指定责任的灵活性. 3)由于在一个类中产生的事件可以被发送到组成中的其它类处理器上,类的集合可以作为一个整体. 使用场景: 1)多个对象可以处理一个请求,而其处理器却是未知的. 2)想要在不指定确