`

责任链模式(原创)

 
阅读更多

前言:

下面是一个通用的任务链实现,类似于tomcat的valve,应用仅需实现并配置valve接口相关实现即可,pipeline也作为valve的实现。共分为4部分:

第一部分为管道的相关实现,仅在spring ioc配置中需要使用,用户无需扩展。

第二部分为valve相关定义,定义了一个需要应用扩展的valve接口,业务逻辑在此处实现。

第三部分为测试用例部分。

第四部分为spring配置片段。

======================================================================

1、pipeline相关实现

======================================================================

package com.wolf.design.responsibility.chain.pipeline;

import java.util.ArrayList;
import java.util.List;

/**
 * Author: jiyanbin
 * Date: 13-11-18:上午11:06
 * JDK: 1.7
 */
public class BasePipeline<V> {
    private List<V> valves;

    public BasePipeline(int initSize) {
        valves = new ArrayList<V>(initSize);
    }

    public BasePipeline() {
        this(2);
    }

    /**
     * 增加阀门
     *
     * @param valve 阀门
     */
    public void addValve(V valve) {
        valves.add(valve);
    }

    /**
     * 删除任务阀门
     *
     * @param valve 任务阀门
     */
    public void removeValve(V valve) {
        valves.remove(valve);
    }

    /**
     * 返回所有阀门
     *
     * @return 管道中的阀门
     */
    public List<V> getValves() {
        return valves;
    }

    public void setValves(List<V> valves) {
        this.valves = valves;
    }
}
=======================================================================

package com.wolf.design.responsibility.chain.pipeline;

/**
 * Author: jiyanbin
 * Date: 13-11-18:上午11:18
 * JDK: 1.7
 */
public interface Pipeline<Context, E extends Exception> extends Valve<Context,E>{
    public void handle(Context context)
            throws E;
}
======================================================================

package com.wolf.design.responsibility.chain.pipeline;


import com.wolf.design.responsibility.chain.valve.SimpleValveChain;
import com.wolf.design.responsibility.chain.valve.Valve;
import com.wolf.design.responsibility.chain.valve.ValveChain;

/**
 * Author: jiyanbin
 * Date: 13-11-18:上午11:07
 * JDK: 1.7
 *
 * 支持spring IOC配置,如{@code
 * <bean id="getFromCachePipeline" class="cn.com.betasoft.dsat.pipeline.SimplePipeline">
        <property name="valves">
            <list>
                <ref bean="setIndicatorTagValve"/>
                <ref bean="setIndicatorTimeWindowValve"/>
            </list>
        </property>
  </bean>}
 */
public class SimplePipeline<Context, E extends Exception> extends BasePipeline<Valve<Context, E>> implements Pipeline<Context,E>{
    /**
     * 管道处理。
     *
     * @param context 阀门上下文.
     */
    @Override
    public void handle(Context context)
            throws E
    {
        long begin = System.currentTimeMillis();
        ValveChain<Context, E> chain = new SimpleValveChain<Context, E>(getValves());
        chain.handleNext(context);
    }

    @Override
    public void handle(Context context, ValveChain<Context, E> chain) throws E {
        handle(context);
        chain.handleNext(context);
    }
}
======================================================================

2、Valve相关实现

======================================================================

package com.wolf.design.responsibility.chain.valve;

import java.util.List;

/**
 * Author: jiyanbin
 * Date: 13-11-18:上午10:54
 * JDK: 1.7
 */
public class BaseValveChain<V>{
    protected List<V> valves = null;

    protected int index = 0;

    protected int size;

    public BaseValveChain(List<V> valves)
    {
        this.valves = valves;
        this.size = valves.size();
    }

    public BaseValveChain(List<V> valves, int index)
    {
        this(valves);
        this.index = index;
    }
}

======================================================================

package com.wolf.design.responsibility.chain.valve;

import java.util.List;

/**
 * Author: jiyanbin
 * Date: 13-11-18:上午10:55
 * JDK: 1.7
 */
public class SimpleValveChain<Context, E extends Exception> extends BaseValveChain<Valve<Context, E>> implements ValveChain<Context, E> {

    public SimpleValveChain(List<Valve<Context, E>> valves) {
        super(valves);
    }

    @Override
    public void handleNext(Context context) throws E {
        if (index < size) {
            valves.get(index++).handle(context, this);
        }
    }
}

======================================================================

package com.wolf.design.responsibility.chain.valve;

/**
 * Author: jiyanbin
 * Date: 13-11-18:上午9:18
 * JDK: 1.7
 */

/**
 * 阀门
 * <p/>
 * <p/>
 * 标记接口
 *
 * @author jiyanbin
 * @version 1.00 Aug 22, 2003 11:52:44 PM
 *          <p/>
 *          {@link com.wolf.design.responsibility.chain.pipeline.SimplePipeline#valves}中存放的是实现此接口的阀门。如
 *          {@code
 *          public class SetIndicatorTimeWindowValve<T extends Map<String, Object>> implements Valve<T, Exception> {
 *              @Override public void handle(T context, ValveChain<T, Exception> chain) throws Exception {
 *              。。。。。。。
 *              }
 *          }
 *          }
 */
public interface Valve<Context, E extends Exception> {
    /**
     * 阀门处理接口。根据context中的信息,进行处理。ValveChain用于控制
     * 是否需要执行下一个阀门.
     *
     * @param context 阀门上下文
     * @param chain   阀门控制链,控制是否需要继续执行管道中的阀门.
     */
    public abstract void handle(Context context, ValveChain<Context, E> chain)
            throws E;
}

======================================================================

package com.wolf.design.responsibility.chain.valve;

/**
 * Author: jiyanbin
 * Date: 13-11-18:上午9:43
 * JDK: 1.7
 */
public interface ValveChain<Context,E extends Exception> {
    public void handleNext(Context context) throws E;
}

======================================================================

3、测试用例

======================================================================

package com.wolf.design.responsibility.chain.test;

import com.wolf.design.responsibility.chain.valve.Valve;
import com.wolf.design.responsibility.chain.valve.ValveChain;


import java.util.Map;


/**
 * Author: jiyanbin
 * Date: 下午12:08
 * JDK: 1.7
 */
public class ExampleValve<T extends Map<String, Object>> implements Valve<T, Exception> {

    @Override
    public void handle(T context, ValveChain<T, Exception> chain) throws Exception {
        System.out.print("abc");
        chain.handleNext(context);
    }
}

======================================================================

package com.wolf.design.responsibility.chain.test;

import com.wolf.design.responsibility.chain.pipeline.Pipeline;

import java.util.HashMap;
import java.util.Map;

/**
 * Author: jiyanbin@betamail.net
 * Date: 上午10:35
 * JDK: 1.7
 */
public class PipelineMain {
    /**
     * 可以通过spring的方式获取pipeline
     */
    private Pipeline<? super Map<String, Object>, Exception> pipeline;

    public void main(String[] args) throws Exception {
        pipeline.handle(new HashMap<String, Object>());
    }

    public void setPipeline(Pipeline<? super Map<String, Object>, Exception> pipeline) {
        this.pipeline = pipeline;
    }
}

/**
 * $Log: Create By jiyanbin At 上午10:35
 * **************************************************Modify history*************************************************
 * Date                Modifier               Cause
 *
 * *****************************************************************************************************************
 */

======================================================================

4、spring配置

======================================================================

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--<import resource="dsat-se-model-result.xml"/>-->
    <!--++++++++++++++Get result from cache valve++++++++++++++-->
    <bean id="exampleValve" class="com.wolf.design.responsibility.chain.test.ExampleValve">

    </bean>

    <bean id="otherPipeline" class="com.wolf.design.responsibility.chain.pipeline.SimplePipeline">

        <property name="valves">
            <list>
                <!--如果有多个valve链,在此处配置-->
                <ref bean="exampleValve"/>
            </list>
        </property>
    </bean>

    <!--++++++++++++++Get result from cache pipeline++++++++++++++-->
    <bean id="examplePipeline" class="com.wolf.design.responsibility.chain.pipeline.SimplePipeline">
        <property name="valves">
            <list>
                <!--如果有多个valve链,在此处配置-->
                <ref bean="exampleValve"/>

                 <ref bean="otherPipeline"/>
            </list>
        </property>
    </bean>

    <bean id="pipelineMain" class="com.wolf.design.responsibility.chain.test.PipelineMain">
        <property name="pipeline" ref="examplePipeline"/>
    </bean>
</beans>

======================================================================

分享到:
评论

相关推荐

    java设计模式_原创

    其中包括责任链模式、命令模式、迭代器模式、访问者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。责任链模式通过建立处理请求的对象链,使得请求可以在链上传递,直到被某个对象...

    原创-设计模式实现代码

    - 责任链模式(Chain of Responsibility):避免向对象的发送者和接收者耦合具体的处理逻辑,将多个处理对象连接成一条链,并沿着这条链传递请求,直到有对象处理它为止。 - 状态模式(State):允许一个对象在其...

    w3school 设计模式教程 飞龙整理 20141001

    3. 行为型模式:关注对象间的交互,包括责任链模式(将请求沿着处理者链传递)、命令模式(将请求封装为对象)、解释器模式(实现简单的语言解析)、迭代器模式(遍历集合对象)、中介者模式(简化对象间通信)、...

    “开心麻花”娱乐传媒公司的运营模式分析.zip

    同时,公司还通过电影改编、网络剧制作、艺人经纪等多元化业务,形成了内容生产、传播和衍生产品开发的全产业链布局。 在盈利策略上,“开心麻花”不仅依靠门票收入,还积极开发周边商品、广告赞助等多元化收入来源...

    2019网络原创节目发展分析报告(网络剧).rar

    同时,网络剧将进一步探索线上线下融合的新模式,如线下体验活动、衍生品开发等,以实现产业链的延伸。 总结,这份报告全面揭示了2019年中国网络剧的发展现状、特点及趋势,对于了解网络剧行业的变迁、预测未来发展...

    创业计划书-服装装饰箱包类-辞寒汉文化现代服装有限责任公司创业计划书

    创业计划书是任何初创企业的重要基石,它详细阐述了公司的...辞寒汉文化现代服装有限责任公司通过这份计划书,旨在展示其独特的商业模式、强大的市场潜力和清晰的发展路径,从而吸引资金和人才,推动公司的成功起步。

    北理工科技孵化大厦项目可行性研究报告(原创).zip

    8. **运营模式与管理**:报告将提出项目的运营模式,包括管理团队的构建、合作模式、盈利模式等,以确保大厦的高效运作。 9. **风险评估与应对策略**:任何项目都存在不确定性,报告会识别可能的风险,如市场波动、...

    从网络游戏产业问题看信息业的新趋势论文开题报告书模板.doc

    首先,将对网络游戏的产业模式进行详细介绍,包括其运营模式、收入模式、产品模式和技术进步模式等方面,这些模式对整个产业链的影响至关重要。接着,我们将重点关注网络游戏产业中的网络运营商和内容提供商(ICP)...

    原创 《外包业务整体管理方案》

    - **提升自身管理能力**:不断提升自身的外包管理能力,符合eSCM-CL(电子供应链管理成熟度模型)的要求。 #### 三、如何选择合适的软件外包商? **选择标准:** - **外包商资质**:考虑其是否通过了CMMI、ISO...

    电子商务三创赛.ppt

    * 每个成员的责任心和分工 * 团队的和谐与协作 三创赛的时间表 电子商务三创赛的时间表包括: * 2011年5月29日报名截止 * 2011年5月31日至6月12日初评 * 2011年6月13日决赛 * 2011年12月左右国家赛决赛 网网站...

    电子商务三创赛.pptx

    同时,学生也需要考虑到项目的可行性、原创性和商业模式等方面。 本次比赛的意义在于激发学生的创新精神,鼓励学生在电商领域中进行创业和创新。通过本次比赛,学生可以锻炼自己的创新能力、商业头脑和团队协作能力...

    (评审规则)第三届中国“互联网+”大学生创新创业大赛全国总决赛评审规则.docx

    - **社会责任**: 分析项目在带动上下游产业链发展方面的社会效益。 ### 总结 通过对第三届中国“互联网+”大学生创新创业大赛全国总决赛评审规则的分析,可以看出,评审团非常重视项目的创新性、团队的专业能力和...

    小议省级广电媒体融合发展现状及思路.docx

    第一板块的领先机构如央视国际、上海文广、杭州华数,凭借强大的背景支持和创新的商业模式,成功构建了新媒体产业链。第二板块的省级电视台,如湖南广电、广东广电、江苏广电等,正在积极布局新媒体,通过内容创新和...

    高一语文下册3月月考试卷5[精选].doc

    商业模式方面,以迪斯尼为例,试卷强调了原创能力与产业深度开发的重要性,以及成功商业模式的构建。这要求学生能够从多角度理解一个企业如何通过多元化的经营策略实现利益最大化,对学生的商业逻辑与市场分析能力...

    人机交互新时代:多维度快速看清ChatGPT

    随着商业模式的成熟,ChatGPT的普及预计将进一步激发人工智能产业链各环节的发展,如芯片制造、计算能力提升、算法优化等。 对于全球科技巨头而言,ChatGPT的出现影响了它们的战略布局,其中最为显著的或许是微软对...

    第三届中国工业互联网大赛工业互联网+产融合作专业赛组织方案【模板】.pdf

    参赛条件包括对团队的要求(团队组成、报名方式、责任声明、尽职调查等)和解决方案要求(原创性、符合赛题、提供相关证明材料等)。比赛分为初赛、复赛、决赛三个阶段,所有参赛流程均需通过指定平台进行。 此次...

    第三届中国互联网+大学生创新创业大赛.docx

    - **创新性(40分)**:此部分着重评估项目的原创性和独特性。参赛团队需要展示出他们的产品或服务如何区别于市场上已有的解决方案,以及这些创新点是如何解决特定问题或满足市场需求的。 - **商业性(25分)**:这...

    自己手动写搜索引擎

    1. **内容优化**:提供高质量、原创、有深度的内容,合理使用关键词,保持页面结构清晰。 2. **技术SEO**:确保网站结构良好,URL结构简洁,页面加载速度快,对移动设备友好,采用响应式设计。 3. **外部链接**:...

    电商企业——“三只松鼠”营运提升建议.zip

    综上,"三只松鼠"应充分利用数据分析,优化供应链,提升客户体验,强化品牌,采用新技术,并探索新零售模式,以实现全面的营运提升。在不断变化的市场环境中,持续创新和改进是企业保持竞争力的关键。

    冰点文库下载.rar

    《冰点文库下载器:解锁在线文档自由获取的秘密》 在互联网时代,各类知识库如雨后春笋般...作为使用者,我们在享受便利的同时,也需要有意识地平衡个人需求与社会责任,共同维护一个健康、有序的网络知识生态环境。

Global site tag (gtag.js) - Google Analytics