一、责任链模式概念
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
责任链模式中的角色
抽象处理者(Handler)角色
该角色对请求进行抽象,并定义一个方法来设定和返回对下一个处理者的引用。具体处理者(Handler)角色
该角色接到请求后,可以选择将请求处理掉,或者将请求传递给下一个处理者。 由于具体处理者持有对下一个处理者的引用,因此,如果需要,具体处理者可以访问下一个处理者,把问题給下一个处理者,并以此类推
二、类结构
三、模拟场景进行代码演示
1、场景
工厂种当产品完成后需要经过3个工人的检查,每个工人检查的都是产品不同的规格参数,但是规定,产品合格的条件是至少有两个工人合格。
- 工人抽象类(相当于Handler)
public abstract WorkMan{
protected WorkMan nextWorkMan;
public void dofilter(Product product){
if(product.passNum>=2){
product.isPass=true;
return
}
this.check(product);
if( this.nextWorkMan!=null)
this.nextWorkMan.dofilter(product)
}
void check(Product product);
public WorkMan getNextWorkMan() {
return nextWorkMan;
}
public void setNextWorkMan(WorkMan nextWorkMan) {
this.nextWorkMan = nextWorkMan;
}
}
- 具体检查产品的工人实现(相当于Concrte Handler)
//检查工人1
public class WorkMan1 implements WorkMan{
public void check(Product product){
//检查逻辑
}
}
//检查工人2
public class WorkMan2 implements WorkMan{
public void check(Product product){
//检查逻辑
}
}
//检查工人3
public class WorkMan3 implements WorkMan{
public void check(Product product){
//检查逻辑
}
}
- 工人检查链
public class WorkManChain{
private WorkMan workManChain;
private Product product;
public WorkManChain(WorkMan workMan,Product product){
this.product = product;
this.workManChain = workMan;
}
public void doFilter(){
this.workManChain.doFilter(this.product);
}
}
四、责任链模式作用与应用场景
- 优点
1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4、增加新的请求处理类很方便。