按一定顺序执行 "链" 上的每一个节点
责任链模式中的角色:抽象处理对象,具体处理对象,责任链
以博客审核流程为例来说明,假设博客的发布需要经过,安全审核,盗版审核,质量审核
利用spring容器带来的便利
抽象处理对象
@Data
public abstract class Audit {
protected Audit nextAudit;
public abstract void audit();
}
image.gif
具体处理对象
@Component
public class SecurityAudit extends Audit{
@Override
public void audit() {
System.out.println("安全审核");
if(nextAudit!=null){ nextAudit.audit(); }
}
}
image.gif
@Component
public class QualityAudit extends Audit{
@Override
public void audit() {
System.out.println("质量审核");
if(nextAudit!=null){ nextAudit.audit(); }
}
}
image.gif
@Component
public class PirateAudit extends Audit{
@Override
public void audit() {
System.out.println("盗版审核");
if(nextAudit!=null){ nextAudit.audit(); }
}
}
image.gif
责任链
责任链的初始化方式很多,总之能说明链中每个节点的顺序就行,也可以直接写死每个节点的下一个节点是什么,不利于维护和扩展一般不会这么做
@Configuration
@ComponentScan("com.shyf.audit")
public class AuditConfig {
//责任链初始化配置,这里指明了各个节点在责任链中的顺序
private static List<String> auditOrderList = new ArrayList<String>(){{
add("securityAudit");
add("pirateAudit");
add("qualityAudit");
}};
@Bean
//责任链初始化,返回责任链的第一个节点
public Audit audit(ApplicationContext applicationContext){
Audit audit = null;
Audit temp = null;
for (String s:auditOrderList) {
Audit bean = (Audit)applicationContext.getBean(s);
if(audit==null){
audit = bean;
temp = audit;
}else{
temp.setNextAudit(bean);
temp = temp.getNextAudit();
}
}
return audit;
}
}
image.gif
调用
public class AppTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
AuditConfig.class);
Audit audit = (Audit)context.getBean("audit");
audit.audit();
}
}
image.gif
结果和责任链初始化配置中的一样
image image.gif
扩展
新增一个其他审核,放在盗版审核后面
@Component
public class OtherAudit extends Audit{
@Override
public void audit() {
System.out.println("其他审核");
if(nextAudit!=null){nextAudit.audit();}
}
}
image.gif
//责任链初始化配置,这里指明了各个节点在责任链中的顺序
private static List<String> auditOrderList = new ArrayList<String>(){{
add("securityAudit");
add("pirateAudit");
add("otherAudit");
add("qualityAudit");
}};
image.gif
结果
image image.gif
网友评论