经典的设计模式22——职责链模式

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

    文章目录


    老感觉职责链模式和状态模式有点像好像都能实现请假流程。百度来一波。
    真是巧了职责链状态策略则三个长得好像。
    在这里插入图片描述

    职责链模式

    定义
    使多个对象都有机会处理请求从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链并沿着这条链传递该请求直到有一个对象处理它为止。
    结构
    抽象处理者handler定义一个处理请求的接口包含抽象处理方法和一个后继连接。
    具体处理者concretehandler实现抽象处理者的处理方法判断能否处理本次请求如果可以处理请求则处理否则将该请求转给它的后继者。
    客户类角色client创建处理链并向链头的具体处理者对象提交请求它不关心处理细节和请求的传递过程。
    本质分离职责动态组合。
    当客户提交一个请求时请求是沿链传递直至有一个concretehandler对象负责处理它。这样做的好处就是请求者不用管哪个对象来处理该请求会被处理。
    使得接收者和发送者都没有对方的明确信息且链中的对象自己也并不知道链的结构。结果是职责链可以简化对象的相互连接他们仅仅需要保持一个指向其后继者的引用而不需要保持它所有的候选接受者的引用大大降低耦合度。
    我们是在客户端定义链的结构也就是说我们可以随时地增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性。
    不过一个请求极有可能到了链的末端都得不到处理或者因为没有正确配置而得不到处理所以需要事先考虑全面。
    优点
    1、降低了对象之间的耦合度。
    该模式降低了请求发送者和接受者的耦合度。
    2、增强了系统的可扩展性。
    可以根据需要增加新的强求处理类满足开闭原则。
    3、增强了给对象指派职责的灵活性。
    当工作流程发生变化可以动态的改变链内的成员或者修改它们的次序也可以动态的新增或者删除责任。
    4、责任链简化了对象之间的连接。
    一个对象只需要保持一个指向其后继者的引用不需要保持其它所有处理者的引用这避免了使用众多的if、else语句。
    5、责任分担
    每个类只需要处理自己该处理的工作不能处理的传递给下一个对象完成明确各类的责任范围符合类的单一职责原则。
    缺点
    不能保证每个请求一定被处理。由于一个请求没有明确的接收者所以不能保证它一定会被处理该请求可能一直传到链的末端都得不到处理。
    对比较长的职责链请求的处理可能涉及多个处理对象系统性能将受到一定影响。
    职责链建立的合理性要靠客户端来保证增加了客户端的复杂性可能会由于职责链的错误设置而导致系统出错如可能会造成循环调用。

    package 职责链模式;
    
    public abstract class Handler {
    	protected Handler handler;
    
    	public void setHandler(Handler handler) {
    		this.handler = handler;
    	}
    
    	public abstract void handlerequest(int request);
    
    }
    
    
    package 职责链模式;
    
    public class concreteHandlerA extends Handler {
    
    	@Override
    	public void handlerequest(int request) {
    		if (request >= 0 && request < 10) {
    			System.out.println("concreteHandlerA处理请求" + request);
    		} else if (handler != null) {
    			handler.handlerequest(request);
    		}
    
    	}
    
    }
    
    
    package 职责链模式;
    
    public class concreteHandlerB extends Handler {
    
    	@Override
    	public void handlerequest(int request) {
    		if (request >= 10 && request < 20) {
    			System.out.println("concreteHandlerB处理请求" + request);
    		} else if (handler != null) {
    			handler.handlerequest(request);
    		}
    	}
    
    }
    
    
    package 职责链模式;
    
    public class concreteHandlerC extends Handler {
    
    	@Override
    	public void handlerequest(int request) {
    		if (request >= 20 && request < 30) {
    			System.out.println("concreteHandlerC处理请求" + request);
    		} else if (handler != null) {
    			handler.handlerequest(request);
    		}
    
    	}
    
    }
    
    
    package 职责链模式;
    
    public class Client {
    
    	public static void main(String[] args) {
    		Handler h1 = new concreteHandlerA();
    		Handler h2 = new concreteHandlerB();
    		Handler h3 = new concreteHandlerC();
    
    		h1.setHandler(h2);
    		h2.setHandler(h3);
    
    		int[] requests = { 2, 5, 18, 19, 28 };
    		for (int i = 0; i < requests.length; i++) {
    			h1.handlerequest(requests[i]);
    		}
    
    	}
    
    }
    
    
  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6