23设计模式之责任链模式 (COR)
2015-09-20 14:46
567 查看
返回首页
2. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3. 可处理一个请求的对象集合应被动态指定。
2. ConcreteHandler:处理它所负责的请求。可访问它的后继者。如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
3. Client:向链上的具体处理者(ConcreteHandler)对象提交请求。
b) PMRequestHandle.swift
c) TLRequestHandle.swift
b) DimissionRequest.swift
c) AddMoneyRequest.swift
d) LeaveRequest.swift
请求完毕
===========
要加薪, 项目经理审批!
===========
要请假, 项目组长审批!
一、概述
COR属于行为型模式中的一种,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。这一模式的想法是,给多个对象处理一个请求的机会,从而解耦发送者和接受者。二、适用性
1. 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。2. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3. 可处理一个请求的对象集合应被动态指定。
三、参与者
1. Handler:定义一个处理请求的接口。(可选)实现后继链。2. ConcreteHandler:处理它所负责的请求。可访问它的后继者。如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
3. Client:向链上的具体处理者(ConcreteHandler)对象提交请求。
四、类图
五、代码实现
1. Handler:定义一个处理请求的接口。(可选)实现后继链。
RequestHandle.swiftimport Foundation /// 定义一个处理请求的接口 protocol RequestHandle { func handleRequest(request:Request) }
2. ConcreteHandler:处理它所负责的请求。可访问它的后继者。如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
a) HRRequestHandle.swiftimport Foundation /// 处理它所负责的请求。可访问它的后继者。 class HRRequestHandle: RequestHandle { func handleRequest(request: Request) { if request is DimissionRequest { print("要离职, 人事审批!") } print("请求完毕") } }
b) PMRequestHandle.swift
import Foundation /// 处理它所负责的请求。可访问它的后继者。 class PMRequestHandle: RequestHandle { var rh:RequestHandle init(requestHandle:RequestHandle){ self.rh = requestHandle } func handleRequest(request: Request) { if request is AddMoneyRequest { print("要加薪, 项目经理审批!") } else { rh.handleRequest(request) } } }
c) TLRequestHandle.swift
import Foundation /// 处理它所负责的请求。可访问它的后继者。 class TLRequestHandle: RequestHandle { var rh:RequestHandle init(requestHandle:RequestHandle){ self.rh = requestHandle } func handleRequest(request: Request) { if request is LeaveRequest { print("要请假, 项目组长审批!") } else { rh.handleRequest(request) } } }
3. 提交的请求。
a) Request.swiftimport Foundation /// 请求接口 protocol Request { }
b) DimissionRequest.swift
import Foundation /// DimissionRequest离职请求 class DimissionRequest: Request { }
c) AddMoneyRequest.swift
import Foundation /// 加薪请求 class AddMoneyRequest: Request { }
d) LeaveRequest.swift
import Foundation /// 请假请求 class LeaveRequest: Request { }
六、测试
1. 代码
// 职责链模式 let hr:RequestHandle = HRRequestHandle() let pm:RequestHandle = PMRequestHandle(requestHandle: hr) let tl:RequestHandle = TLRequestHandle(requestHandle: pm) // 向链上的具体处理者(ConcreteHandler)对象提交请求 // team leader处理离职请求 var request:Request = DimissionRequest() tl.handleRequest(request) print("===========") // team leader处理加薪请求 request = AddMoneyRequest() tl.handleRequest(request) print("===========") // team leader处理请假请求 request = LeaveRequest() tl.handleRequest(request)
2. 运行结果
要离职, 人事审批!请求完毕
===========
要加薪, 项目经理审批!
===========
要请假, 项目组长审批!
相关文章推荐
- Hadoop笔记之Hive安装异常(Missing Hive Execution Jar)
- UNIX环境高级编程之第10章:信号
- 内存映射的原理
- 研磨数据结构与算法-06递归的应用
- ios9兼容系列之解决iPad提交报错“iPad Multitasking support requires launch story board in bundle '”
- 【JDBC】day02_PreparedStatement_元数据
- HDU1361(Parencodings)
- HDU 5461Largest Point
- 【Python系列4】国外程序员整理的机器学习资源大全——Python篇
- RMAN恢复drop purge的表
- 【SHOI2014】【BZOJ3566】概率充电器
- 回调函数的理解
- solr环境的搭建之windows和tomcat
- SimpleDateFormat
- Mycat全局Sequence详解
- cin.ignore()的用法
- Maven打包web项目报错Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if
- [note]构建常量
- 解决jquery操作checkbox火狐下第二次无法勾选问题
- hdu 1700 (圆的内接三角形 要周长最大)