责任链设计模式的定义:
也叫职责链模式 为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到不满足条件跳出或执行完所有的为止。
比如:请假的规定,不同的上级都有可以处理请假的申请,组长可以批准2天之内的请假,项目经理可以批准7天之内的请假,项目高管可以批准20天之内的请假。这里的请求,有多个可以处理者可以处理。
责任链模式的结构
- 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
- 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
- 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
责任链模式的例子
比如班主任可以批准2天的假期,系主任可以批准7天内的假期,院长可以批准10天内的假期。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Leader teacher1 = new ClassAdviser();
Leader teacher2 = new DepartmentHead();
Leader teacher3 = new Dean();
teacher1.setNext(teacher2);
teacher2.setNext(teacher3);
//提交请求
teacher1.handleRequest(8);
}
}
public abstract class Leader {
private Leader next;
public Leader getNext() {
return next;
}
public void setNext(Leader next) {
this.next = next;
}
public abstract void handleRequest(int LeaveDays);
}
public class ClassAdviser extends Leader {
@Override
public void handleRequest(int LeaveDays) {
if (LeaveDays <= 2){
System.out.println("班主任批准您请假" + LeaveDays + "天。");
}else {
if (getNext() != null){
getNext().handleRequest(LeaveDays);
}else {
System.out.println("请假天数太多,没有人批准该假条!");
}
}
}
}
public class DepartmentHead extends Leader {
@Override
public void handleRequest(int LeaveDays) {
if (LeaveDays <= 7){
System.out.println("系主任批准您请假" + LeaveDays + "天。");
}else {
if (getNext() != null){
getNext().handleRequest(LeaveDays);
}else {
System.out.println("请假天数太多,没有人批准该假条!");
}
}
}
}
public class Dean extends Leader {
@Override
public void handleRequest(int LeaveDays) {
if (LeaveDays <= 10) {
System.out.println("院长批准您请假" + LeaveDays + "天。");
}else {
if (getNext() != null){
getNext().handleRequest(LeaveDays);
}else {
System.out.println("请假天数太多,没有人批准该假条!");
}
}
}
}
okHttp的拦截器
okHttp的五个拦截器就是调用责任链的模式,使每个拦截器都有机会拿到Request和Response。
我们用上面的例子,模仿OkHttp的责任链实现。
/**
* 学生请假的请求的对象
*/
public class Request {
int day =0;
}
/**
* 领导的批准结果返回
*/
public class Response {
boolean isAgreed = false;
}
public interface Chain {
Request getRequest();
Response processChain();
}
public interface Character {
Response processRequest(Chain chain);
}
public class ClassAdviser implements Character {
@Override
public Response processRequest(Chain chain) {
Request request = chain.getRequest();
Response response =new Response();
if (request.day<=2){
response.isAgreed = true;
System.out.println("班主任批准请假"+request.day+"天");
}else {
response = chain.processChain();
}
return response;
}
}
public class DepartmentHead implements Character {
@Override
public Response processRequest(Chain chain) {
Request request = chain.getRequest();
Response response =new Response();
if (request.day <= 7){
response.isAgreed = true;
System.out.println("系主任批准请假"+request.day+"天");
}else {
response = chain.processChain();
}
return response;
}
}
public class Dean implements Character {
@Override
public Response processRequest(Chain chain) {
Request request = chain.getRequest();
Response response = new Response();
if (request.day <= 10){
response.isAgreed = true;
System.out.println("院长同意批准请假"+request.day+"天");
}else {
response.isAgreed = false;
}
return response;
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Request request = new Request();
request.day = 11;
List<Character> characters = new ArrayList<>();
characters.add(new ClassAdviser());
characters.add(new DepartmentHead());
characters.add(new Dean());
Chain chain = new RealChain(characters,request,0);
Response response = chain.processChain();
System.out.println("最后"+response.isAgreed);
}
}
网友评论