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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(十五)职责链模式-代码实现相关的知识,希望对你有一定的参考价值。

介绍

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

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

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

 

代码:

//处理器的接口定义

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进行分离,想要这么做也很简单,方式有很多,例如实现配置文件方式加载.

 

以上是关于(十五)职责链模式-代码实现的主要内容,如果未能解决你的问题,请参考以下文章

设计模式十五—— 职责链模式

设计模式(十五):职责链模式

设计模式 职责链模式

职责链模式vs状态模式区别

java学习-设计模式-职责链模式

职责链模式- Chain of Responsibility