简单梳理职责链模式
职责链模式的实现
我们在公司中,经常需要提交各种申请流程,比如休假或者涨薪申请。
但通常我们得申请也并是都能被我们得直属领导直接审批,而是需要层层请示。
我们来看下这种生活场景如何用设计模式来实现。
请求类,用来记录请求类型内容和数量等
public class Request {
private String requestType;
private String requestContent;
private int number;
public String getRequestType() {
return requestType;
}
public void setRequestType(String requestType) {
this.requestType = requestType;
}
public String getRequestContent() {
return requestContent;
}
public void setRequestContent(String requestContent) {
this.requestContent = requestContent;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
抽象管理人类,用来给各种领导类继承实现
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 RequestApplication(Request request);
}
经理类,作为直属领导得实现
//经理
public class CommonManager extends Manager{
public CommonManager(String name) {
super(name);
}
@Override
public void RequestApplication(Request request) {
if(request.getRequestType().equals("请假")&&request.getNumber()<=2){
System.out.println(name+":"+request.getRequestContent()+"数量 "+request.getNumber()+"被批准。");
}else{
if(superior!=null){
superior.RequestApplication(request);
}
}
}
}
总监类,作为经理类得上级
//总监
public class Majordomo extends Manager{
public Majordomo(String name) {
super(name);
}
@Override
public void RequestApplication(Request request) {
if(request.getRequestType().equals("请假")&&request.getNumber()<=5){
System.out.println(name+":"+request.getRequestContent()+"数量 "+request.getNumber()+"被批准。");
}else{
if(superior!=null){
superior.RequestApplication(request);
}
}
}
}
总经理类,作为最高领导,有权决定一切
//总经理
public class GeneraManager extends Manager{
public GeneraManager(String name) {
super(name);
}
@Override
public void RequestApplication(Request request) {
if(request.getRequestType().equals("请假")){
System.out.println(name+":"+request.getRequestContent()+"数量 "+request.getNumber()+"被批准。");
}else if(request.getRequestType().equals("加薪")&&request.getNumber()<=500){
System.out.println(name+":"+request.getRequestContent()+"数量 "+request.getNumber()+"被批准。");
}else if(request.getRequestType().equals("加薪")&&request.getNumber()>500){
System.out.println(name+":"+request.getRequestContent()+"数量 "+request.getNumber()+"再说吧。");
}
}
}
这样我们前期的定义就算做完了,
然后我们看具体应用中的使用。
定义业务方法
看在具体业务逻辑中如何使用
public class ChainTest {
public static void main(String[] args) {
//职责链模式
func1();
}
public static void func1(){
CommonManager jingli = new CommonManager("经理");
Majordomo zongjian = new Majordomo("总监");
GeneraManager zongjingli = new GeneraManager("总经理");
jingli.setSuperior(zongjian);
zongjian.setSuperior(zongjingli);
Request request = new Request();
request.setRequestType("请假");
request.setRequestContent("员工请假");
request.setNumber(1);
jingli.RequestApplication(request);
Request request2 = new Request();
request2.setRequestType("请假");
request2.setRequestContent("员工请假");
request2.setNumber(4);
jingli.RequestApplication(request2);
Request request3 = new Request();
request3.setRequestType("加薪");
request3.setRequestContent("员工加薪申请");
request3.setNumber(500);
jingli.RequestApplication(request3);
Request request4 = new Request();
request4.setRequestType("加薪");
request4.setRequestContent("员工加薪申请");
request4.setNumber(1000);
jingli.RequestApplication(request4);
}
}
执行结果
经理:员工请假数量 1被批准。
总监:员工请假数量 4被批准。
总经理:员工加薪申请数量 500被批准。
总经理:员工加薪申请数量 1000再说吧。
结果分析
职责链模式,使多个对象都有机会处理请求,从而避免请求得发起者和接收者之间耦合。
将这个对象连城一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
联系作者
微信公众号
xiaomingxiaola
(BossLiu)
QQ群
58726094
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 384276224@qq.com