✍ 责任链模式是我们介绍的第一个行为型模式,这里有必要把行为型模式好好介绍一下:
行为型模式(Behavioral Pattern) 是对 在不同的对象之间划分责任和算法的抽象化 。行为型模式不仅仅关注类和对象的结构,而
且 重点关注它们之间的相互作用 。通过行为型模式,可以更加清晰地 划分类与对象的职责 ,并 研究系统在运行时实例对象之间的交互 。在系统运行时,对象并不是孤立的,它们可以通过相互通信与协作完成某些复杂功能,一个对象在运行时也将影响到其他对象的运行。
行为型模式分为 类行为型模式
和 对象行为型模式
两种:
职责链可以是 一条直线
、 一个环或者一个树形结构
, 最常见的职责链是 直线型
, 即沿着 一条单向的链
来传递请求 。 链上的每一个对象都是请求处理者 , 职责链模式可以 将请求的处理者组织成一条链 , 并使请求沿着链传递 , 由链上的处理者对请求进行相应的处理 , 客户端无须关心请求的处理细节以及请求的传递 , 只需将请求发送到链上即可 , 将请求的发送者和请求的处理者解耦 。 这就是职责链模式的模式动机 。
职责链模式(Chain of Responsibility Pattern) 的定义如下:避免请求发送者与接收者耦合在一起, 让多个对象都有可能接收请求 , 将这些对象连接成一条链 ,并且 沿着这条链传递请求 ,直到有对象处理它为止。由于英文翻译的不同,职责链模式又称为责任链模式。
职责链模式包含如下角色:
✍ 演示一下:
课程类
public class Course {
private String name;
private String article;
private String video;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
}
public String getVideo() {
return video;
}
public void setVideo(String video) {
this.video = video;
}
@Override
public String toString() {
return "Course{" +
"name='" + name + '\'' +
", article='" + article + '\'' +
", video='" + video + '\'' +
'}';
}
}
责任者的抽象类 (Handler: 抽象处理者)
public abstract class Approver {
protected Approver approver;
public void setNextApprover(Approver approver){
this.approver = approver;
}
public abstract void deploy(Course course);
}
审核笔记的责任者(笔记审核员) (ConcreteHandler: 具体处理者)
需要导入jar包 下载地址
import org.apache.commons.lang3.StringUtils;
public class ArticleApprover extends Approver {
@Override
public void deploy(Course course) {
if(StringUtils.isNotEmpty(course.getArticle())){
System.out.println(course.getName()+"含有配套文档,批准");
if(approver != null){
approver.deploy(course);
}
}else{
System.out.println(course.getName()+"不含有配套文档,不批准,流程结束");
return;
}
}
}
审核视频的责任者(视频审核员) (ConcreteHandler: 具体处理者)
import org.apache.commons.lang3.StringUtils;
public class VideoApprover extends Approver{
@Override
public void deploy(Course course) {
if(StringUtils.isNotEmpty(course.getVideo())){
System.out.println(course.getName()+"含有视频,批准");
if(approver != null){
approver.deploy(course);
}
}else{
System.out.println(course.getName()+"不含有视频,不批准,流程结束");
return;
}
}
}
测试类(Client: 客户类)
public class Test {
public static void main(String[] args) {
Approver articleApprover = new ArticleApprover(); //笔记审核员
Approver videoApprover = new VideoApprover(); //视频审核员
Course course = new Course();
course.setName("Java设计模式");
course.setArticle("Java设计模式的配套笔记");
course.setVideo("Java设计模式的视频");
articleApprover.setNextApprover(videoApprover); //审核视频
articleApprover.deploy(course); //审核视频
}
}
这个设计模式还是比较简单的
✍ 模式分析
在职责链模式里 , 很多对象
由每一个对象对其下家的引用而连接起来形成一条链 。请求在这条链上传递 , 直到链上的某一个对象处理此请求为止 。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求 , 这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任
✍ 说一下它的优缺点
职责链模式的优点
职责链模式的缺点
✍ 模式适用环境
在以下情况下可以使用职责链模式:
✍模式扩展
纯与不纯的职责链模式