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