zoukankan      html  css  js  c++  java
  • 设计模式学习笔记四:责任链模式

    责任链模式:Responsibility Of Chain,简称RoC。链式结构,由多个结点组成,具备依次向下传递的特性,到达每个结点可以选择做处理或向下传递。

    每个结点可以设计为独立的功能单元,好处就是实现了解耦。设计好传递条件,即可清除在哪个结点做什么,出问题去哪里修改。

    我简单画了一个时序图,不大标准,希望能清晰表达意思。

    x.a 和x.b代表if…else逻辑。


    下面用一个例子供参考,背景是我之前想实现一个表达式解析工具,打算使用责任链来实现每个单元的处理逻辑。后来发现有了ANTLR类库可以直接生成就没有继续实现,有兴趣的朋友可以关注下,此是题外话。

    /*  
     * ResponsibilityOfChain.java 1.0 2014/08/11  
     *   
     * 声明:欢迎转载,请注明出处。  
     *   
     */ 
    
    package com.array7.roc;
    
    public interface IBaseChain {
    	public void execute(IBaseChain chain);
    }
    
    package com.array7.roc;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class BaseChain implements IBaseChain {
    	List<IBaseChain> chains = new ArrayList<IBaseChain>();  
    	int index = 0;
    	public void execute(IBaseChain chain) {
    		if (index == chains.size()) {
    			System.out.println("arrived end!");
    			return;
    		}
    		IBaseChain nextChain = chains.get(index);
    		index ++;
    		nextChain.execute(chain);
    	}
    	public BaseChain set(IBaseChain chain) {
    		this.chains.add(chain);
    		return this;
    	}
    	
    	public static void main(String[] args) {
    		BaseChain chain = new BaseChain().set(new SecondNode()).set(new MinuteNode()).set(new HourNode());
    		chain.execute(chain);
    	}
    }
    
    package com.array7.roc;
    
    public class HourNode implements IBaseChain {
    
    	public void execute(IBaseChain chain) {
    		System.out.println("HourNode Chain...");
    		chain.execute(chain);
    	}
    
    }
    
    package com.array7.roc;
    
    public class MinuteNode implements IBaseChain {
    
    	public void execute(IBaseChain chain) {
    		System.out.println("MinuteNode Chain...");
    		chain.execute(chain);
    	}
    
    }
    
    
    package com.array7.roc;
    
    public class SecondNode implements IBaseChain {
    
    	public void execute(IBaseChain chain) {
    		System.out.println("Second Chain...");
    		chain.execute(chain);
    	}
    
    }
    
  • 相关阅读:
    模仿JavaAppArguments.java示例,编写一个程序,此程序从命令行接收多个数 字,求和之后输出结果,写出其的设计思想、程序流程图、源程序代码。
    大道至简第二章读后感
    大道至简第一章读后感
    md5实现
    jdk-动态代理
    使用反射复制对象
    java-二分查找法
    java-base64
    cxf框架使用(一)
    Freemarket学习笔记(一)
  • 原文地址:https://www.cnblogs.com/liushijie/p/4712925.html
Copyright © 2011-2022 走看看