问题引人:申请聚餐费用,申请人填写申请单,然后交给领导审阅,如果申请批准下来,领导会通知申请人,然后申请人去财务领费用,如果没有就罢了。项目经理、部门经理、总经理审批的费用额度不同。一般申请人并不知道到底是由谁来处理他的请求。
项目经理-》部门经理->总经理,也可能是部门经理->总经理,责任链是变化的。
不使用设计模式的解决方式:
package notusingMode;
public class FeeRequest {
//提交申请给部门经理
public String requestToProjectManager(String user,double fee){
String str = "";
if(fee<500){
str = this.projectHandle(user,fee);
}
else if(fee<1000){
str = this.deptManagerHandle(user,fee);
}
else if(fee>=1000){
str = this.generalManagerHandle(user,fee);
}
return str;
}
private String generalManagerHandle(String user, double fee) {
String str = "";
if("小李".equals(user)){
str="总经理同意"+user+"聚餐费用"+fee+"元的请求";
}
else {
str ="总经理不同意"+user+"聚餐费用"+fee+"元的请求";
}
return str;
}
private String deptManagerHandle(String user, double fee) {
String str = "";
if("小李".equals(user)){
str="部门经理同意"+user+"聚餐费用"+fee+"元的请求";
}
else {
str ="部门经理不同意"+user+"聚餐费用"+fee+"元的请求";
}
return str;
}
private String projectHandle(String user, double fee) {
String str = "";
if("小李".equals(user)){
str="项目经理同意"+user+"聚餐费用"+fee+"元的请求";
}
else {
str ="项目经理不同意"+user+"聚餐费用"+fee+"元的请求";
}
return str;
}
}
package notusingMode;
public class Client {
public static void main(String[] args) {
FeeRequest request = new FeeRequest();
String ret1 = request.requestToProjectManager("小李", 300);
}
}
问题抽象:客户端发出一个请求,会有很多对象都可以来处理这个请求,而且不同对象的处理逻辑是不一样的。对于客户端而言,无所谓谁来处理。还希望处理流程是可以灵活
变动的,而处理请求的对象需要能方便地修改或者被替换掉,以适应新的业务功能的需要。如何?=---》责任链模式
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一个链,并沿着这条链传递该请求,直到有一个对象处理它为止。
结构:
Handler:定义职责的接口,通常在这里定义处理请求的方法,可以在这里实现后继链
ConcreteHandler:实现职责的类,在这个类中,实现对在它职责范围内请求的处理,如果不处理就转发请求给后继者。
Client:职责链的客户端,向链上的具体处理对象提交请求,让责任链负责处理。
package chainOfResponsibility;
public abstract class Handler {
protected Handler successor; // 后继者
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest();
}
package chainOfResponsibility;
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequest() {
boolean someCondition = false;
if(someCondition){
//如果属于自己职责范围,就在这里处理请求
System.out.println("ConcreteHandler1 handle request");
}
else{//不属于自己职责范围,就转发给后继的职责对象
if(this.successor!=null){
this.successor.handleRequest();
}
}
}
}
package chainOfResponsibility;
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest() {
boolean someCondition = false;
if(someCondition){
//如果属于自己职责范围,就在这里处理请求
System.out.println("ConcreteHandler2 handle request");
}
else{//不属于自己职责范围,就转发给后继的职责对象
if(this.successor!=null){
this.successor.handleRequest();
}
}
}
}
package chainOfResponsibility;
public class Client {
public static void main(String[] args) {
// 先组装责任链
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
h1.setSuccessor(h2);
//然后提交请求
h1.handleRequest();
}
}
package chainOfResponsibilitySolve;
public abstract class Handler {
protected Handler successor; // 后继者
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract String handleFeeRequest(String user,double fee);
}
使用责任链设计模式解决上述的费用请求问题:
package chainOfResponsibilitySolve;
public class ProjectManager extends Handler {
String str = "";
@Override
public String handleFeeRequest(String user, double fee) {
if(fee<500){
if("小李".equals(user)){
str="项目经理同意"+user+"聚餐费用"+fee+"元的请求";
}
else {
str="项目经理不同意"+user+"聚餐费用"+fee+"元的请求";
}
return str;
}
else{
//超过500,继续传递给级别更高的人来处理
if(this.successor!=null){
return successor.handleFeeRequest(user, fee);
}
}
return str;
}
}
package chainOfResponsibilitySolve;
public class DeptManager extends Handler {
String str = "";
@Override
public String handleFeeRequest(String user, double fee) {
if(fee<1000){
if("小李".equals(user)){
str="部门经理同意"+user+"聚餐费用"+fee+"元的请求";
}
else {
str="部门经理不同意"+user+"聚餐费用"+fee+"元的请求";
}
return str;
}
else{
//超过500,继续传递给级别更高的人来处理
if(this.successor!=null){
return successor.handleFeeRequest(user, fee);
}
}
return str;
}
}
package chainOfResponsibilitySolve;
public class GeneralManager extends Handler {
String str = "";
@Override
public String handleFeeRequest(String user, double fee) {
if(fee>=1000){
if("小李".equals(user)){
str="总经理同意"+user+"聚餐费用"+fee+"元的请求";
}
else {
str="总经理不同意"+user+"聚餐费用"+fee+"元的请求";
}
return str;
}
else{
//超过500,继续传递给级别更高的人来处理
if(this.successor!=null){
return successor.handleFeeRequest(user, fee);
}
}
return str;
}
}
package chainOfResponsibilitySolve;
public class Client {
public static void main(String[] args) {
// 先组装责任链
Handler h1 = new ProjectManager();
Handler h2 = new DeptManager();
Handler h3 = new GeneralManager();
h1.setSuccessor(h2);
h2.setSuccessor(h3);
//然后提交请求
h1.handleFeeRequest("张三",300);
}
}
处理多个请求的应用如包multipleRequest,但是有一个问题是,只要增加一个业务,就需要修改职责的接口,这是很不灵活的,java开发中很强调面向接口编程,因此接口应该相对保持稳定。
modifyMultipleRequest
功能链,如过滤器,在业务逻辑处理之前,进行权限检查,通用数据校验,数据逻辑校验等处理如销售信息保存的应用如sales
分享到:
相关推荐
主要介绍了C#设计模式之ChainOfResponsibility职责链模式解决真假美猴王问题,简单说明了责任链模式的概念,并结合《西游记》中真假美猴王故事背景为实例分析了责任链模式的具体使用技巧,需要的朋友可以参考下
欢迎此存储库中的ChainOfResponsibility.java文件说明了如何实现“责任链设计模式”。 该程序是使用NetBeans 8.0创建的,可以在上找到。 要使用该程序,只需运行该程序并通过控制台输出查看结果。
5.1ChainofResponsibility(责任链模式) 168 5.1.1定义 168 5.1.2现实中的实例——军情的传递 169 5.1.3C#实例——采购分级审批 170 5.1.4Java实例——智能大厦安全系统 174 5.1.5优势和缺陷 178 5.1.6应用...
5.1ChainofResponsibility(责任链模式) 168 5.1.1定义 168 5.1.2现实中的实例——军情的传递 169 5.1.3C#实例——采购分级审批 170 5.1.4Java实例——智能大厦安全系统 174 5.1.5优势和缺陷 178 5.1.6应用...
pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 pattern/src/behavior/memento //13.7备忘录模式 pattern/src/behavior/state //13.8状态模式 ...
行为型简介职责链模式(ChainofResponsibility)命令模式(Command)解释器模式(Interpreter)迭代器模式(Iterator)中介者模式(Mediator)备忘录模式(Memento)观察者模式(Observer)状态模式(State)策略模式(Strategy)模板...
责任链设计模式 前言 对于已经工作了的小伙伴,你八成是见过"责任链"这种面向对象的设计模式的,还在上学的小伙伴也不用着急,你迟早会接触到的。本文旨在让小白同学和 不太熟悉责任链的朋友能够Swift对这一设计模式...
Java 中的设计模式在 Java 中... 迭代器观察员[模板方法] (TemplateMethod/) 【责任链】(ChainOfResponsibility/) [状态](状态/) 【调解员】(调解员/) [纪念品] (纪念品/) [空对象] (NullObject/) [访客] (访客/)
设计模式-责任链 demo
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...
pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 pattern/src/behavior/memento //13.7备忘录模式 pattern/src/behavior/state //13.8状态模式 ...
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...
pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 pattern/src/behavior/memento //13.7备忘录模式 pattern/src/behavior/state //13.8状态模式 ...
pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 pattern/src/behavior/memento //13.7备忘录模式 pattern/src/behavior/state //13.8状态模式 ...