参考
行为
为请求创建一个对象链,每个对象依次检查此请求,并对其进行处理,或者将它传给链中的下一个对象
关键代码
责任链中每个对象都拥有同一个父类/接口/函数
应用场景
- 框架中间件
- 消息过滤器
- 权限拦截器
Go代码实例
gin 框架中间件方式
package main
import "fmt"
type HandlerFunc func()
type HandlerChain []HandlerFunc
type Router struct {
Handlers HandlerChain
}
func (r *Router) Use(middleware ...HandlerFunc) {
r.Handlers = append(r.Handlers, middleware...)
}
func (r *Router) Next() {
for _, h := range r.Handlers {
h()
}
}
func handle1() {
fmt.Println("中间件1")
}
func handle2() {
fmt.Println("中间件2")
}
func main() {
r := new(Router)
r.Use(handle1, handle2)
r.Next()
}
Java代码代码
1.Bean
/**
* Bean
*
* @author zhipeng_Tong
*/
public class Requset {
private String requestType; // 申请类型
private String requsetContent; // 申请内容
private int number; // 数量
public String getRequestType() {
return requestType;
}
public void setRequestType(String requestType) {
this.requestType = requestType;
}
public String getRequsetContent() {
return requsetContent;
}
public void setRequsetContent(String requsetContent) {
this.requsetContent = requsetContent;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
2.Handler
/**
* Handler
*
* @author zhipeng_Tong
*/
public abstract class Manager {
protected String name; // 姓名
protected Manager superior; // 上级管理者
public Manager(String name) {
this.name = name;
}
// 设置管理者的上级
public void setSuperior(Manager superior) {
this.superior = superior;
}
// 申请请求
public abstract void requestApplications(Requset requset);
}
3.ConcreteHandler
/**
* ConcreteHandler
*
* @author zhipeng_Tong
*/
public class CommonManager extends Manager { // 经理
public CommonManager(String name) {
super(name);
}
@Override
public void requestApplications(Requset requset) {
if (requset.getRequestType().equals("请假") && requset.getNumber() <= 2) {
System.out.println(String.format("%s:%s 数量%s 被批准",
name, requset.getRequsetContent(), requset.getNumber()));
} else {
if (superior != null)
superior.requestApplications(requset);
}
}
}
/**
* ConcreteHandler
*
* @author zhipeng_Tong
*/
public class Majordomo extends Manager { // 总监
public Majordomo(String name) {
super(name);
}
@Override
public void requestApplications(Requset requset) {
if (requset.getRequestType().equals("请假") && requset.getNumber() <= 5) {
System.out.println(String.format("%s:%s 数量%s 被批准",
name, requset.getRequsetContent(), requset.getNumber()));
} else {
if (superior != null)
superior.requestApplications(requset);
}
}
}
/**
* ConcreteHandler
*
* @author zhipeng_Tong
*/
public class GeneralManager extends Manager { // 总经理
public GeneralManager(String name) {
super(name);
}
@Override
public void requestApplications(Requset requset) {
if (requset.getRequestType().equals("请假")) {
System.out.println(String.format("%s:%s 数量%s 被批准",
name, requset.getRequsetContent(), requset.getNumber()));
} else if (requset.getRequestType().equals("加薪") && requset.getNumber() <= 500) {
System.out.println(String.format("%s:%s 数量%s 被批准",
name, requset.getRequsetContent(), requset.getNumber()));
} else if (requset.getRequestType().equals("加薪") && requset.getNumber() > 500) {
System.out.println(String.format("%s:%s 数量%s 再说吧!",
name, requset.getRequsetContent(), requset.getNumber()));
} else {
System.out.println("你走吧!!!");
}
}
}
4.Client 向链上的具体处理者(ConcreteHandler)对象提交请求。
public class Client {
public static void main(String[] args) {
CommonManager commonManager = new CommonManager("经理");
Majordomo majordomo = new Majordomo("总监");
GeneralManager generalManager = new GeneralManager("总经理");
commonManager.setSuperior(majordomo);
majordomo.setSuperior(generalManager);
Requset requset = new Requset();
requset.setRequestType("请假");
requset.setRequsetContent("小明请假");
requset.setNumber(1);
commonManager.requestApplications(requset);
System.out.println("--------------------");
requset.setRequestType("请假");
requset.setRequsetContent("小明请假");
requset.setNumber(4);
commonManager.requestApplications(requset);
System.out.println("--------------------");
requset.setRequestType("加薪");
requset.setRequsetContent("小明请求加薪");
requset.setNumber(500);
commonManager.requestApplications(requset);
System.out.println("--------------------");
requset.setRequestType("加薪");
requset.setRequsetContent("小明请求加薪");
requset.setNumber(5000);
commonManager.requestApplications(requset);
System.out.println("--------------------");
}
}
运行结果
经理:小明请假 数量1 被批准
--------------------
总监:小明请假 数量4 被批准
--------------------
总经理:小明请求加薪 数量500 被批准
--------------------
总经理:小明请求加薪 数量5000 再说吧!
--------------------