Java——Java基础之设计模式篇:责任链模式

1、需求

学校OA系统的采购审批项目:需求是

采购员采购教学器材
如果金额小于等于5000,由教学主任审批
如果金额小于等于10000,由院长审批
如果金额小于等于30000,由副校长审批
如果金额超过30000以上,有校长审批

2、方案一

最容易想到的,将需求转变成if else。导致代码强耦合,需要知道不同人审批的金额界限,并且如果审批金额界限发生变化,相关代码也要改变。

if (price <= 5000) {
          
   
	教学主任审批
} else if (price <= 10000) {
          
   
	院长审批
} else if (price <= 30000) {
          
   
	副校长审批
} else {
          
   
	校长审批
}

3、方案二:责任链

责任链模式:为请求创建了一个处理者对象的链。每个处理者都包含对另一个处理者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个处理者,依此类推。

    客户端:创建处理链,从责任链的第一个处理者开始处理请求 抽象处理者:包含下一个处理者、处理请求的方法 具体处理者:实现抽象处理者的处理请求方法,判断能否处理本次请求,如果可以则处理请求,否则将该请求转给它的后继者

代码实现:重在思路

    创建请求
@Data
public class MyRequest {
          
   
	private int price;
	public MyRequest(int price) {
          
   
		this.price = price;
	}
}
    创建抽象处理者
public abstract class Handler {
          
   
	// 必须:下一个处理者
	Handler nextHandler;
	public void setNext(Handler nextHandler) {
          
   
        this.nextHandler = nextHandler;
    }
	// 必须:处理请求的方法
	public abstract void handleRequest(MyRequest request);
	
	// 可选
	String handlerName;
	public Handler(String name) {
          
   
		this.handlerName = name;
	}
}
    创建具体处理者
public class 教学主任 extends Handler {
          
   
	// 必须:实现抽象处理者的处理请求方法
    @Override
    public void handleRequest(MyRequest request) {
          
   
        if(request.getPrice() <= 5000) {
          
   
            System.out.println("被"+this.name+"处理");
        } 
        //如果不满足条件,则丢给下一个处理者
        else {
          
   
        	System.out.println("不能被"+this.name+"处理");
            nextHandler.handleRequest(request);
        }
    }
    // 可选
    public 教学主任(String name) {
          
   
        super(name);
    }
}
public class 院长 extends Handler {
          
   
	// 必须:实现抽象处理者的处理请求方法
    @Override
    public void handleRequest(MyRequest request) {
          
   
    	// 判断能否处理本次请求,如果可以则处理请求
        if (request.getPrice() <= 5000) {
          
   
            System.out.println("被"+this.name+"处理");
        } 
        // 否则丢给下一个处理者
        else {
          
   
       	 	System.out.println("不能被"+this.name+"处理");
            nextHandler.handleRequest(request);
        }
    }
    // 可选
    public 院长(String name) {
          
   
        super(name);
    }
}
public class 副校长 extends Handler {
          
   }
public class 校长 extends Handler {
          
   }
    客户端
public class Client {
          
   
	public static void main(String[] args) {
          
   
		// 1、创建请求
		MyRequest request = new MyRequest(28000);
		// 2、创建所有需要的处理者
		教学主任 教学主任1 = new 教学主任("张教学主任");
		院长 院长2 = new 院长("王院长");
		副校长 副校长3 = new 副校长("孙副校长");
		校长 校长4 = new 校长("李校长");
		// 3、形成责任链
		教学主任1.setNext(院长2);
		院长2.setNext(副校长3);
		副校长3.setNext(校长4);
		// 4、从责任链的第一个处理者开始处理请求
		教学主任1.handleRequest(request);
	}
}
经验分享 程序员 微信小程序 职场和发展