责任链模式
职责链模式定义如下:职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者 耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传 递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。
在职责链模式结构图中包含如下几个角色:
● Handler(抽象处理者):它定义了一个处理请求的接口,一般设计为抽象类,由于不同的 具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法。因为每一个处理者 的下家还是一个处理者,因此在抽象处理者中定义了一个抽象处理者类型的对象(如结构图 中的successor),作为其对下家的引用。通过该引用,处理者可以连成一条链。
● ConcreteHandler(具体处理者):它是抽象处理者的子类,可以处理用户请求,在具体处理 者类中实现了抽象处理者中定义的抽象请求处理方法,在处理请求之前需要进行判断,看是 否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者;在具体处理 者中可以访问链中下一个对象,以便请求的转发。
在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这 个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上 的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织 链和分配责任
package com.example.demo.pattern.behavioral.chain;
/**
* 功能描述: 责任链模式
* 例子:富士康工厂生产手机 A负责装配,B负责贴膜,C负责测试 必须按ABC的顺序来
* @author luxiaomeng
* @date 2020/8/25 13:52
* 修改日志: 暂无
*/
public class ChainOfResponsibility {
public static void main(String[] args) {
// 创建手机
Phone phone = new Phone();
// 创建责任链
Handler a = new A();
Handler b = new B();
Handler c = new C();
a.setNext(b);
b.setNext(c);
a.work(phone);
//A组装了手机
//B贴了膜
//C进行了测试
//手机制造完成
}
}
class Phone {
// 状态 1组装 2已贴膜 3已测试
private int status =0;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
/**
* 抽象处理类
*/
abstract class Handler {
protected Handler next;
public abstract void work(Phone phone);
public Handler getNext() {
return next;
}
public void setNext(Handler next) {
this.next = next;
}
}
class A extends Handler {
@Override
public void work(Phone phone) {
if (phone.getStatus() == 0) {
System.out.println("A组装了手机");
phone.setStatus(1);
next.work(phone);
}
}
}
class B extends Handler {
@Override
public void work(Phone phone) {
if (phone.getStatus() == 1) {
System.out.println("B贴了膜");
phone.setStatus(2);
next.work(phone);
}
}
}
class C extends Handler {
@Override
public void work(Phone phone) {
if (phone.getStatus() == 2) {
System.out.println("C进行了测试");
phone.setStatus(3);
System.out.println("手机制造完成");
}
}
}