一,概念:

  责任链模式(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. [第一波模拟\day3\T2]{独立集}(bubble.cpp)

    [问题描述] 有一天,一个名叫顺旺基的程序员从石头里诞生了.又有一天,他学会了冒泡排序和独立集.在一个图里,独立集就是一个点集,满足任意两个点之间没有边.于是他就想把这两个东西结合在一起.众所周知,独 ...

  2. jQuery常用案例总结

    模态对话框 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  3. PHP基础 变量

    $a=123;$b="123";$c='456';$d=<<<a <div style=" qwerqwrqwt </div>a; / ...

  4. NYOJ-673悟空的难题~~水题~~

    悟空的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 自从悟空当上了齐天大圣,花果山上的猴子猴孙们便也可以尝到天上的各种仙果神酒,所以猴子猴孙们的体质也得到了很好的 ...

  5. hdu 4539

    #include<stdio.h> #include<string.h> ]; int s]; int main() { int i,j,n,m; int ch; while( ...

  6. unbuntu下安装多个JAVA JDK版本及如何切换

    当前环境已经安装过jdk1.6.0_45安装JDK 1.7.x时,若安装错误,可执行以下步骤:sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-ge ...

  7. POJ1256 Anagram

    Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %lld & %llu Submit Status Descript ...

  8. Java中网络编程

    以下内容引用自http://wiki.jikexueyuan.com/project/java/networking.html: 术语网络编程指编写跨多种设备(电脑)执行的,设备使用一个网络互相连接的 ...

  9. Java二维码的解码和编码

    原文:http://www.open-open.com/code/view/1430906793866 import java.io.File; import java.util.Hashtable; ...

  10. ubuntu磁盘分区和挂载