(十五)职责链模式-代码实现

介绍

概念:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

应用场景:经常增加处理场景的业务,比如处理零食商品的类,不断有新增的零食,就需要不断增加处理零食的方法,耦合度太高.为了降低耦合度使用职责链模式.

好处:扩展灵活.结构清晰.

代码:

//处理器的接口定义

package note.com.chain;

public interface Handler {

    public void doHandler(String label);

}

//定义各种情况的处理实现

package note.com.chain;

/**
 * 动物类处理
 * @author lxz
 *
 */
public class AnimalChain  implements Handler{

    public void doHandler(String label) {
        System.out.println(label+":由我动物类处理器处理");
    }

}
package note.com.chain;

/**
 * 鱼类处理
 * @author lxz
 *
 */
public class FishChain  implements Handler{

    public void doHandler(String label) {
        System.out.println(label+":由我鱼类处理器处理");
    }

}
package note.com.chain;

/**
 * 昆虫类处理
 * @author lxz
 *
 */
public class InsectChain  implements Handler{

    public void doHandler(String label) {
        System.out.println(label+":由我昆虫处理器处理");
    }

}
package note.com.chain;

/**
 * 人类处理器
 * @author lxz
 *
 */
public class PersonChain  implements Handler{

    public void doHandler(String label) {
        System.out.println(label+":由我人类处理器处理");
    }

}

//实现一个控制处理器的分配类

package note.com.chain;

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

/**
 * 处理入口
 * @author lxz
 *
 */
public class MainChain implements Handler{
    public static final String FISH = "fish";
    public static final String ANIMAL = "animal";
    public static final String INSECT = "insect";
    public static final String PERSON = "person";
    private Map<String,Handler> chains = new HashMap<String,Handler>();
    public MainChain(){
        chains.put(FISH, new FishChain());
        chains.put(ANIMAL, new AnimalChain());
        chains.put(INSECT, new InsectChain());
        chains.put(PERSON, new PersonChain());
    }

    public void doHandler(String label) {
        Handler handler = chains.get(label);
        if(handler!=null){
            handler.doHandler(label);
        }
    }

}

//测试类

package note.com.chain;

/**
 * 测试类
 * @author lxz
 *
 */
public class ChainTest {
    public static void main(String[] args) {
        System.out.println("我这里有一个生物需要处理");
        String thing1 = MainChain.INSECT;//昆虫
        String thing2 = MainChain.ANIMAL;//动物
        new MainChain().doHandler(thing1);
        new MainChain().doHandler(thing2);
    }
}

//结果

我这里有一个生物需要处理
insect:由我昆虫处理器处理
animal:由我动物类处理器处理

由此,所有的待处理都从MainChain入口进行处理,不需要知道具体是谁处理了.另外,有新增的物种需要处理时只需要扩张Handler的实现,并且把该实现收MainChain管理即可.  例子中没有将实际处理类与MainChain进行分离,想要这么做也很简单,方式有很多,例如实现配置文件方式加载.

时间: 2024-10-17 18:26:13

(十五)职责链模式-代码实现的相关文章

(十五)责任链模式-代码实现

介绍 概念:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 应用场景:经常增加处理场景的业务,比如处理零食商品的类,不断有新增的零食,就需要不断增加处理零食的方法,耦合度太高.为了降低耦合度使用职责链模式. 好处:扩展灵活.结构清晰. 代码: //处理器接口定义 package note.com.chain; public abstract class Handler { public String

设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就推卸给另外个一个部门(对象).至于究竟谁来解决问题呢?政府部门就是为了能够避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,而且沿着这条链传递请求.直到有(部门)对象处理它为止. 样例1:js的事件浮升机制 样例2: 2.问题 假设有多个对象都有

设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,并且沿着这条链传递请求,直到有(部门)对象处理它为止. 例子1:js的事件浮升机制 例子2: 2.问题 如果有多个对象都有可能接受请求,如何避免避免请求发送者与接收者耦合在一起呢? 3.解决方案 职责链模式(Ch

设计模式C++实现二十:职责链模式

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受之间的耦合关系.将这个对象连城一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 职责链模式处理中,当客户有一个请求时,请求沿着链传递直到有一个对象处理它,我们在设计的时候也必须保证每一个请求都能被处理.接受者和发送者都没有对方的明确信息,而且链中的每个对象自己也不知道自己处于在链的哪个位置.我们只需要把链设置好,也就是对每个链的节点设置后后或者前节点来承接请求(当当前链节

二十:职责链模式详解(类似于spring的hangler处理请求)

定义:为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. “看这个定义,就是将一堆可以处理请求的对象连成一条链,然后一个一个试着处理请求.这好像是可以解决麦当劳订餐的问题的,我先来看看我刚才苦B的订餐过程是什么样子的.” “首先应该有一个麦当劳的分店的类,它的主要功能是可以订餐.” “先来看看职责链模式的类图,这样比较好设计.” “类图还是比较简单的啊,有一个通用的接口,然后就是若干个具体的处理者.

编程模式之十四----行为型----职责链模式

定义 避免把一个请求的发送者和接收者耦合在一起,使多个对象都有机会处理请求.将这个请求的多个接收着连接成一条链,并让请求沿着这个链传递下去,只到有一个结点能处理请求. 职责链模式中,链形成后,不一定非要有一个结点能够处理请求,也就是说,所有结点都可以处理一下再往下传,也可以都不处理,这样说来就比较灵活了. 组成 抽象处理者:AbstractHandler.维护一个对自身类型对象的引用,这个引用作为下一个具体的处理者.声明所有处理者都用到的方法,这个方法的作用是设置本处理者后面的一个处理者.另外声

设计模式(十八)职责链模式(Chain of Responsibility)-行为型

职责链模式(Chain of Responsibility) 职责链模式在程序开发应用中十分广泛,经常使用在公文审批.出差报支等地方,职责链模式的作用就是将对象各自处理的职责分开,虽然职责很多,但是最终只有一个职责进行处理. 实现原理图 职责链模式实现原理图 应用 struts2的拦截器,OA办公应用 在职责链模式中,将条件语句改成多个职责类进行处理,如果不是自己处理,则自动转到下一个职责类,如果在转给下一个职责类进行处理前,需要修改当前的状态,此时就需要用到状态模式,也就是下一个设计模式. 参

重温设计模式(三)——职责链模式(chain of responsibility)

一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所以希望各位多多指教. 二. 什么是链 文章伊始,先让我们了解这个最基本的概念,什么是链. 我给链下了这样的定义: 1. 链是一系列节点的集合. 2. 链的各节点可灵活拆分再重组. 三. 何为职责链 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条

atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3. 调用代码 2 4. 责任链链的特性: 2 5. 模式结构 4 6. 职责链模式包含如下角色:Handler,ConcreteHandler: 具体处理者,HandlerChainUtil ,Client 4 7. 设置哈一个handler,,两个法:排序法,指定法 5 1. 指定法 5 2. 排