设计模式——职责链模式(Chain Of Responsibility)

152 阅读2分钟

参考

行为

为请求创建一个对象链,每个对象依次检查此请求,并对其进行处理,或者将它传给链中的下一个对象

关键代码

责任链中每个对象都拥有同一个父类/接口/函数

应用场景

  • 框架中间件
  • 消息过滤器
  • 权限拦截器

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 再说吧!
--------------------