zoukankan      html  css  js  c++  java
  • 设计模式——责任链模式

    责任链模式:将能够处理同一类请求的对象连成一条链所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,

                     如果能则处理,如果不能则传递给链上的下一个对象。
    优点:将请求者和发送者解耦
             简化对象的处理过程
             可以通过改变链中的成员或成员的顺序来动态的新增或则删除责任。

    缺点:不能保证请求一定会执行,可能或落到责任链之外。

             不容易观察运行时的特征,处理请求的方法比较分散。
    实现方式:链表和非链表两种实现,但是使用集合和数组等非链表实现在实际开发中更方便更常用。

    应用:

    窗口事件的处理。
    Java中的异常机制就是一种责任链模式,catch链就是一种责任链。
    JavaScript中的时间冒泡和捕获机制。
    Servlet中的过滤器的链式处理。
    Structs2中拦截器的调用。

    这个解释很详细:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html

    Demo:

    package com.wxisme.chainofresposibility;
    
    /**
     * 责任链
     * @author wxisme
     *
     */
    public abstract class Handler {
    	protected Handler nextHandler;
    	public abstract void handleRequest(int req);
    	public Handler getNextHandler() {
    		return nextHandler;
    	}
    	public void setNextHandler(Handler nextHandler) {
    		this.nextHandler = nextHandler;
    	}
    	
    }
    
    class ConcreteHandler1 extends Handler {
    	
    	@Override
    	public void handleRequest(int req) {
    		if(req == 1) {
    			System.out.println("1处理请求");
    		}
    		else {
    			System.out.println("1释放请求");
    			this.nextHandler.handleRequest(req);
    		}
    	}
    }
    class ConcreteHandler2 extends Handler {
    	
    	@Override
    	public void handleRequest(int req) {
    		if(req == 2) {
    			System.out.println("2处理请求");
    		}
    		else {
    			System.out.println("2释放请求");
    			this.nextHandler.handleRequest(req);
    		}
    	}
    }
    class ConcreteHandler3 extends Handler {
    	
    	@Override
    	public void handleRequest(int req) {
    		if(req == 3) {
    			System.out.println("3处理请求");
    		}
    		else {
    			System.out.println("3释放请求");
    			this.nextHandler.handleRequest(req);
    		}
    	}
    }
    
    public class Client {
    	public static void main(String[] args) {
    		Handler h1 = new ConcreteHandler1();
    		Handler h2 = new ConcreteHandler2();
    		Handler h3 = new ConcreteHandler3();
    		
    		h1.setNextHandler(h2);
    		h2.setNextHandler(h3);
    		
    		h1.handleRequest(1);
    		System.out.println("-----------");
    		h1.handleRequest(2);
    		System.out.println("-----------");
    		h1.handleRequest(3);
    	}
    }
    

     运行结果:
    1处理请求
    -----------
    1释放请求
    2处理请求
    -----------
    1释放请求
    2释放请求
    3处理请求

  • 相关阅读:
    5. 图 (算法和数据结构笔记)
    4. 树与二叉树 (算法和数据结构笔记)
    Go第八篇之包的使用
    Go第七篇之规范的接口
    Go第六篇之结构体剖析
    Go第三篇之大话容器
    Go第一篇之轻松入门
    Go第四篇之流程控制
    C简介与环境配置
    程序结构与基本语法
  • 原文地址:https://www.cnblogs.com/wxisme/p/4550712.html
Copyright © 2011-2022 走看看