责任链模式使多个对象都有机会处理请求,实现了发送者和接受者之间的耦合,将这些接受者连成一条链,使处理请求沿着这条链,直到有一个对象处理请求为止。常用的场景有servlet中的filter,针对if-else和switch-case进行优化。
一、需求举例:
项目中需求开发应用场景:
1.如果初级工程师能够完成,就让初级工程师完成,否则交给中级工程师;
2.如果中级工程师能够完成,就让中级工程师完成,否则交给高级工程师;
3.如果高级工程师能够完成,就让高级工程师完成,否则交给Top工程师拒绝需求;
二、对象关系
三、代码实战
工程师父类:AbstractEngineer.java
package com.lance.chainpattern;
public abstract class AbstractEngineer {
public static final int EASY = 1;
public static final int MIDDLE = 2;
public static final int DIFFICULT = 3;
protected int difficulty;
protected AbstractEngineer nextEngineer;
public void setNextEngineer(AbstractEngineer abstractEngineer) {
this.nextEngineer = abstractEngineer;
}
public void develop(int difficulty, String program) {
if (this.difficulty >= difficulty) {
finish(program);
return;
}
if (this.nextEngineer != null) {
nextEngineer.develop(difficulty, program);
}
}
abstract protected void finish(String program);
}
初级工程师:JuniorEngineer.java
package com.lance.chainpattern;
public class JuniorEngineer extends AbstractEngineer {
public JuniorEngineer(int difficulty) {
this.difficulty = difficulty;
}
@Override
protected void finish(String program) {
System.out.println("Junior Engineer finish " + program);
}
}
中级工程师:IntermediateEngineer.java
package com.lance.chainpattern;
public class IntermediateEngineer extends AbstractEngineer {
public IntermediateEngineer(int difficulty) {
this.difficulty = difficulty;
}
@Override
protected void finish(String program) {
System.out.println("Intermediate Engineer finish " + program);
}
}
高级工程师:SeniorEngineer.java
package com.lance.chainpattern;
public class SeniorEngineer extends AbstractEngineer {
public SeniorEngineer(int difficulty) {
this.difficulty = difficulty;
}
@Override
protected void finish(String program) {
System.out.println("Senior Engineer finish " + program);
}
}
Top工程师:TopEngineer.java
package com.lance.chainpattern;
public class TopEngineer extends AbstractEngineer {
public TopEngineer(int difficulty) {
this.difficulty = difficulty;
}
@Override
protected void finish(String program) {
System.out.println("Top Engineer refuse " + program);
}
}
主类:ChainPattern.java
package com.lance.chainpattern;
public class ChainPattern {
public static void main(String[] args) {
// 创建对象
AbstractEngineer engineerChain = new JuniorEngineer(AbstractEngineer.EASY);
AbstractEngineer intermediateEngineer = new IntermediateEngineer(AbstractEngineer.MIDDLE);
AbstractEngineer seniorEngineer = new SeniorEngineer(AbstractEngineer.DIFFICULT);
//构建责任链
seniorEngineer.setNextEngineer(new TopEngineer(Integer.MAX_VALUE));
intermediateEngineer.setNextEngineer(seniorEngineer);
engineerChain.setNextEngineer(intermediateEngineer);
System.out.println("==========start==========");
engineerChain.develop(AbstractEngineer.EASY,"easy program");
System.out.println("=========================");
engineerChain.develop(AbstractEngineer.MIDDLE,"middle program");
System.out.println("=========================");
engineerChain.develop(AbstractEngineer.DIFFICULT,"difficult program");
System.out.println("=========================");
engineerChain.develop(4,"too difficult program");
System.out.println("==========end==========");
}
}
输出结果:
==========start==========
Junior Engineer finish easy program
=========================
Intermediate Engineer finish middle program
=========================
Senior Engineer finish difficult program
=========================
Top Engineer refuse too difficult program
==========end==========
网友评论