一,概念:

  责任链模式(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))
}
}

  

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

  1. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...

  2. php设计模式之责任链模式

    php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...

  3. python设计模式之责任链模式

    python设计模式之责任链模式 开发一个应用时,多数时候我们都能预先知道哪个方法能处理某个特定请求.然而,情况并非总是如此.例如,想想任意一种广播计算机网络,例如最早的以太网实现.在广播计算机网络中 ...

  4. 详解java设计模式之责任链模式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...

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

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 package com.test.chainO ...

  6. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...

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

    设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了 ...

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

    一.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决:职责链上的处理者负责处理请求,客户只需要将请求 ...

  9. 【Unity与23种设计模式】责任链模式(Chain of Responsibility)

    GoF中定义: "让一群对象都有机会来处理一项请求,以减少请求发送者与接收者之间的耦合度.将所有的接受对象串联起来,让请求沿着串接传递,直到有一个对象可以处理为止." 举个现实中的 ...

  10. Java进阶篇设计模式之八 ----- 责任链模式和命令模式

    前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...

随机推荐

  1. mac 终端path配置出错,命令无法使用

    mac 命令行中修改path的时候,不小心把path修改错了,而且还 source 了,然后发现只能使用 cd 命令,ls vi 命令都不能使用了. 解决办法,执行下面的语句 export PATH= ...

  2. JavaScript高级程序设计中第2、3章中细节知识点

    第2章 1.<script src='script.js' type='text/javascript'></script>中,只要不包含defer和async属性,浏览器都会 ...

  3. 记第一次开发安卓应用——IT之家RSS阅读器

    这个学期学校开了安卓的课程,因为自己一直学习wp的开发,一直用的是.net和Silverlight这一套,也着实没有太多时间投入安卓的方向去,因为想着毕业也不从事安卓的工作,所以也一直没有怎么研究.但 ...

  4. spring用到的设计模式

    https://www.cnblogs.com/yuefan/p/3763898.html https://www.cnblogs.com/hwaggLee/p/4510687.html https: ...

  5. python013 Python3 条件控制

    Python3 条件控制Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块.可以通过下图来简单了解条件语句的执行过程: if 语句Python中if语句的一 ...

  6. oracle导出多CSV文件的靠谱的

    oracle导出多CSV文件的问题 ---------------------------------------------------------------------- 用ksh脚本从orac ...

  7. [luoguP3092] [USACO13NOV]没有找零No Change(状压DP + 二分)

    传送门 先通过二分预处理出来,每个硬币在每个商品处最多能往后买多少个商品 直接状压DP即可 f[i]就为,所有比状态i少一个硬币j的状态所能达到的最远距离,在加上硬币j在当前位置所能达到的距离,所有的 ...

  8. hdu 1689 求奇环bfs关键是层次图

    #include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> usin ...

  9. Vim enhance part1

    NO1 .认识.命令 例 删除man.config中第1到30行的注释 1.光标移到#上,按下x删除 2.按下j将光标移到第二行#上,之后按下. 3.可以看到第2行的#也被删除了因为.就是重复上次命令 ...

  10. POJ 1017 Packet

    http://poj.org/problem?id=1017 有1*1 2*2...6*6的物品 要装在 6*6的parcel中 问最少用多少个parcel 一直没有找到贪心的策略 问题应该出现在 总 ...