目录
一、责任链模式的定义与类型
- 一、责任链模式的定义与类型
- 二、责任链模式的适用场景
- 三、责任链模式的优点
- 四、责任链模式的缺点
- 五、责任链模式相关设计模式
- 六、责任链模式示例
1、定义
- 为请求创建一个接收此次请求对象的链
2、类型
- 行为型
- 一个请求的处理需要多个对象当中的一个或几个协作处理
- 请求的发送者和接收者(请求的处理)解耦
- 责任链可以动态组合
- 责任链太长或者处理时间过长,影响性能
- 责任链有可能过多
- 责任链模式和状态模式
以提交课程的笔记和视频,审批者进行审批为例进行代码演示
1、代码结构如下:
2、定义一个课程类
package com.rf.designPatterns.behavioral.chainOfResponsibility;
/**
* @description: 定义一个课程类
* @author: xz
*/
public class Course {
private String name;//名称
private String notes;//笔记
private String video;//视频
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
public String getVideo() {
return video;
}
public void setVideo(String video) {
this.video = video;
}
@Override
public String toString() {
return "Course{" +
"name='" + name + '\'' +
", notes='" + notes + '\'' +
", video='" + video + '\'' +
'}';
}
}
3、定义一个审批抽象类
package com.rf.designPatterns.behavioral.chainOfResponsibility;
/**
* @description: 定义一个审批抽象类
* @author: xz
*/
public abstract class Approval {
protected Approval approval;
//设置下一个审批者
public void setNextApproval(Approval approval){
this.approval=approval;
}
//发布课程
public abstract void deploy(Course course);
}
4、定义一个笔记的审批者类
package com.rf.designPatterns.behavioral.chainOfResponsibility;
import org.apache.commons.lang.StringUtils;
/**
* @description: 定义一个笔记的审批者类
* @author: xz
*/
public class NotesApproval extends Approval{
@Override
public void deploy(Course course) {
//如果课程的笔记不为空,进行审批
if(StringUtils.isNotEmpty(course.getNotes())){
System.out.println("课程名称:"+course.getName()+
"包含笔记:"+course.getNotes()+
"【审批同意】");
//因为继承,所以可直接用父类的approval
//如果审批者不为空,继续发布交给下一个审批者
if(approval !=null){
approval.deploy(course);
}
}else{
System.out.println("课程名称:"+course.getName()+
"不包含笔记:"+"【审批拒绝】,流程结束。");
return;
}
}
}
5、定义一个视频的审批者类
package com.rf.designPatterns.behavioral.chainOfResponsibility;
import org.apache.commons.lang.StringUtils;
/**
* @description: 定义一个视频的审批者类
* @author: xz
*/
public class VideoApproval extends Approval{
@Override
public void deploy(Course course) {
//如果课程的视频不为空,进行审批
if(StringUtils.isNotEmpty(course.getVideo())){
System.out.println("课程名称:"+course.getName()+
"包含视频:"+course.getVideo()+
"【审批同意】");
//因为继承,所以可直接用父类的approval
//如果审批者不为空,继续发布交给下一个审批者
if(approval !=null){
approval.deploy(course);
}
}else{
System.out.println("课程名称:"+course.getName()+
"不包含视频:"+"【审批拒绝】,流程结束。");
return;
}
}
}
6、责任链模式的测试类
- 测试类一
package com.rf.designPatterns.behavioral.chainOfResponsibility;
/**
* @description: 责任链模式的测试类
* @author: xz
*/
public class Test {
public static void main(String[] args) {
Course course = new Course();
course.setName("java设计模式之责任链模式");
course.setNotes("任链模式笔记");
course.setVideo("责任链模式视频");
NotesApproval notesApproval = new NotesApproval();
VideoApproval videoApproval = new VideoApproval();
notesApproval.setNextApproval(videoApproval);
notesApproval.deploy(course);
}
}
- 输出结果一,如下
- 测试类二
package com.rf.designPatterns.behavioral.chainOfResponsibility;
/**
* @description: 责任链模式的测试类
* @author: xz
*/
public class Test {
public static void main(String[] args) {
Course course = new Course();
course.setName("java设计模式之责任链模式");
//course.setNotes("任链模式笔记");
course.setVideo("责任链模式视频");
NotesApproval notesApproval = new NotesApproval();
VideoApproval videoApproval = new VideoApproval();
notesApproval.setNextApproval(videoApproval);
notesApproval.deploy(course);
}
}
- 输出结果二,如下:
- 测试类三
package com.rf.designPatterns.behavioral.chainOfResponsibility;
/**
* @description: 责任链模式的测试类
* @author: xz
*/
public class Test {
public static void main(String[] args) {
Course course = new Course();
course.setName("java设计模式之责任链模式");
course.setNotes("任链模式笔记");
//course.setVideo("责任链模式视频");
NotesApproval notesApproval = new NotesApproval();
VideoApproval videoApproval = new VideoApproval();
notesApproval.setNextApproval(videoApproval);
notesApproval.deploy(course);
}
}
- 输出结果三,如下:
7、UML类图如下: