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

介绍

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

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

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

代码:

//处理器接口定义

package note.com.chain;

public abstract class Handler {
    public  String name = null;
    private Handler next = null;

    public Handler(String name,Handler next){
        this.name = name;
        this.next = next;
    }

    /*
     * 入口
     */
    public void execute(String label){
        if(isMe(label)){
            doHandler(label);
        }else{
            nextDo(label);
        }
    }

    /*
     * 子类实现处理逻辑
     */
    public abstract void doHandler(String label);

    /*
     * 判断是否有责任
     */
    private boolean isMe(String label){
        if(name!=null){
            return name.equals(label);
        }
        return false;
    };

    /*
     * 责任传递
     */
    private void nextDo(String label){
        if(next!=null){
            next.doHandler(label);
        }
    }

}

//处理器实现类

package note.com.chain;

/**
 * 第一个处理器
 * @author lxz
 *
 */
public class FirstChain extends Handler{

    public FirstChain(String name, Handler next) {
        super(name, next);
    }

    public void doHandler(String label) {
        System.out.println(label+":由first来处理");
    }

}
package note.com.chain;

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

    public PersonChain(String name, Handler next) {
        super(name, next);
    }

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

}
package note.com.chain;

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

    public InsectChain(String name, Handler next) {
        super(name, next);
    }

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

}
package note.com.chain;

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

    public FishChain(String name, Handler next) {
        super(name, next);
    }

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

}
package note.com.chain;

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

    public AnimalChain(String name, Handler next) {
        super(name, next);
    }

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

}

//组装职责链并进行测试

package note.com.chain;

/**
 * 测试类
 * @author lxz
 *
 */
public class ChainTest {
    public static void main(String[] args) {
        String FISH = "fish";
        String ANIMAL = "animal";
        String INSECT = "insect";
        String PERSON = "person";
        String First = "first";
        //组装责任链
        PersonChain person = new PersonChain(PERSON, null);
        InsectChain insect = new InsectChain(INSECT,person);
        FishChain fish = new FishChain(FISH,insect);
        AnimalChain animal = new AnimalChain(ANIMAL,fish);
        FirstChain first = new FirstChain(First,animal);
        System.out.println("我这里有一个生物需要处理");
        String thing1 = INSECT;//昆虫
        String thing2 = ANIMAL;//动物
        first.execute(thing1);
        first.execute(thing2);
    }
}

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

 FirstChain不用生物的名称来定义,是为了演示更清楚的知道我把FirstChain作为责任传递的第一棒.


此,所有的待处理都从第一个职责链入口进行处理,不需要知道具体是谁处理了.另外,有新增的物种需要处理时只需要扩张Handler的实现,并且把
该实现收在链中管理即可.

责任链和命令模式容易混淆,下篇讲完命令模式再区分它们的区别.

时间: 2024-11-06 20:33:02

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

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

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

设计模式之二十:责任链模式(Chain of Responsibility)

感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有机会来处理请求的方式避免了请求的发送者和接收者之间的耦合.将接收者组织成链式的结构这样能够将请求沿着这条链进行传递,直到有接收者对它进行处理. UML类图: 主要包含: Handler:定义了一个处理请求的接口,实现了定义后继者的方法. ConcreteHandler:处理各自负责的请求,假设不能处

Java设计模式菜鸟系列(十八)责任链模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018231 责任链模式(ChainOfResponsibility): 有多个对象,每个对象持有下一个对象的引用,形成一条链,请求在这条链上传递,直到某一对象决定处理该请求,但是发出者并不清楚最终哪个对象会处理该请求. 一.uml建模: 二.代码实现 /** * 责任链模式:有多个对象,每个对象持有下一个对象的引用,形成一条链, * * 请求在这条链上传递,直到某一对象决定处理该请求,

java23种设计模式之十:责任链模式

最近在学习netty中发现其中用到了责任链模式,然后结合自己在写代码中遇到了大量写if...else的情况,决定学习一下责任链模式. 一.什么样的场景下会选择用责任链模式 我们在进行业务逻辑判断时,需要根据传入参数类型的不同做出不同的处理,如果在传入的参数类型相对较少的情况时,可以用if...else来做判断,这样的确是没有什么问题的,但是如果后期由于业务系统的扩展,导致参数类型会随之延伸出很多种不同的处理,这时就需要用责任链模式来抒代码重构,这样会让代码封装的更好.更简洁,阅读性更强,后期如果

java 责任链模式的三种实现

责任链模式 责任链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止.这里就不再过多的介绍什么是责任链模式,主要来说说java中如何编写.主要从下面3个框架中的代码中介绍. servlet中的filter dubbo中的filter mybatis中的plugin 这3个框架在实现责任链方式不尽相同. servlet中的Filter servlet中分别定义了一个 Filter和Filter

行为型模式:责任链模式

文章首发:行为型模式:责任链模式 十一大行为型模式之四:责任链模式. 简介 姓名 :责任链模式 英文名 :Chain of Responsibility Pattern 价值观 :责任归我 个人介绍 :Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and

设计模式(十二)责任链模式

一.击鼓传花 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客一次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正.开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒. 比如说,贾母.贾赦.贾政.贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链.击鼓者将花传给贾母,开始传花游戏.花由贾母传给贾赦,贾赦传给贾政,贾政传给贾宝玉,贾宝玉传给贾环,贾环再传给贾母,由此往复,如下图所示. 击鼓传花便是一种典型的责任链模式. 二.什么是责任链模式 责任

五分钟一个设计模式之责任链模式

五分钟一个设计模式,用最简单的方法来描述设计模式.查看更多设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/category/3259443 请假流程 假设现在一个公司的请假流程如下:一天及以下由小组组长审批,一天以上三天以下由经理审批,三天以上七天以下由老板审批,七天以上直接劝退. 如果每次请假时都很长的if-else-来判断该去找谁请假,很不容易扩展,我们使用责任链模式来实现. 首先,是一个抽象的父类 public ab

Java设计模式偷跑系列(十八)建模和责任链模式的实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018231 责任链模式(ChainOfResponsibility): 有多个对象,每一个对象持有下一个对象的引用,形成一条链.请求在这条链上传递.直到某一对象决定处理该请求,可是发出者并不清楚终于哪个对象会处理该请求. 一.uml建模: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGh5X3ljdQ==/font/5a6L5L2T/fo