java责任链模式
程序员文章站
2022-05-04 08:40:28
...
责任链模式,通常就是一个请求从最低级开始往上层层的请求,当在某一层满足条件时,请求将被处理,当请求到最高层仍未满足时,则请求不会被处理。
就是一个请求在这个链条的责任范围内,会被相应的处理,如果超出链条的责任范围外,请求不会被相应的处理。
下面代码模拟这样的效果:
创建一个*抽象类,方便所有的具体*部门继承它。
创建具体的*部门
创建一个*工厂来创建*
最后创建一个村民去发出请求
看看这些*部门责任链条怎么处理村民的请求。
运行的效果:
就是一个请求在这个链条的责任范围内,会被相应的处理,如果超出链条的责任范围外,请求不会被相应的处理。
下面代码模拟这样的效果:
创建一个*抽象类,方便所有的具体*部门继承它。
package 责任链模式; /** * * *抽象类 * @Description * @author FuJianyong * 2015-5-23下午03:37:44 */ public abstract class Government { /** * 后继 */ protected Government successor; public void setSuccessor(Government successor){ this.successor = successor; } /** * 处理请求 * @param name */ abstract void requestAccess(String name); }
创建具体的*部门
package 责任链模式; import java.text.SimpleDateFormat; /** * 村长 * @Description * @author FuJianyong * 2015-5-23下午03:45:21 */ public class VillageMaster extends Government { private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override void requestAccess(String name) { if(name.equals("我要告村民")){ System.out.println(sdf.format(System.currentTimeMillis()) + name + "\t村长处理了请求..."); } else{ //如果不是村内的事,村长把处理请求转到上一级 System.out.println(sdf.format(System.currentTimeMillis()) + name + "\t村长把处理请求转到上一级"); this.successor.requestAccess(name); } } }
package 责任链模式; import java.text.SimpleDateFormat; /** * 镇长 * @Description * @author FuJianyong * 2015-5-23下午03:45:21 */ public class TownMaster extends Government { private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override void requestAccess(String name) { if(name.equals("我要告村长")){ System.out.println(sdf.format(System.currentTimeMillis()) + name + "\t镇长处理了请求..."); } else{ //如果不是镇内的事,镇长把处理请求转到上一级 System.out.println(sdf.format(System.currentTimeMillis()) + name + "\t镇长把处理请求转到上一级"); this.successor.requestAccess(name); } } }
package 责任链模式; import java.text.SimpleDateFormat; /** * 县长 * @Description * @author FuJianyong * 2015-5-23下午03:45:21 */ public class CountyMaster extends Government { private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override void requestAccess(String name) { if(name.equals("我要告镇长")){ System.out.println(sdf.format(System.currentTimeMillis()) + name + "\t县长处理了请求..."); } else{ System.out.println(sdf.format(System.currentTimeMillis()) + name + "\t哼...天高皇帝远.县长拒绝请求!"); } } }
创建一个*工厂来创建*
package 责任链模式; /** * *工厂 * @Description * @author FuJianyong * 2015-5-23下午03:53:39 */ public class GovernmentFactory { /** * 创建*部门 * @return */ public static Government createGovernment(){ VillageMaster villageMaster = new VillageMaster(); TownMaster townMaster = new TownMaster(); CountyMaster countyMaster = new CountyMaster(); //设置它们的后继 villageMaster.setSuccessor(townMaster); townMaster.setSuccessor(countyMaster); return villageMaster; } }
最后创建一个村民去发出请求
看看这些*部门责任链条怎么处理村民的请求。
package 责任链模式; import java.text.SimpleDateFormat; import java.util.Random; /** * 村民 * @Description * @author FuJianyong * 2015-5-23下午03:58:42 */ public class VillageMan { private Government government; private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private static final String[] requests = new String[]{"我要告村民", "我要告村长", "我要告镇长", "我要告县长"}; /** * 设置将要请求的*部门 * * @param government */ public void setGovernment(Government government){ this.government = government; } /** * 村民请求 * * @param name */ public void requestAccess(String name){ this.government.requestAccess(name); } //test... public static void main(String[] args) { for(;;){ requestAccess(); //每隔一段20s执行一次循环的处理请求 try { Thread.sleep(20 * 1000); } catch (final InterruptedException e) { e.printStackTrace(); } } } /** * 随机的循环的处理请求 */ private static void requestAccess(){ final VillageMan villageMan = new VillageMan(); //创建一个*从最低级的*部门开始向上请求 villageMan.setGovernment(GovernmentFactory.createGovernment()); //给告县长增加难度 int difficult = 0; for(;;){ int requestNum = requests.length; int random = new Random().nextInt(requestNum); while(random == requestNum - 1){ //要出现三次告县长才能告到县长。 if(difficult > 2){ difficult = 0; break; } System.out.println(sdf.format(System.currentTimeMillis()) + requests[random] + "\t回去吧,今天县长出差了。"); random = new Random().nextInt(requestNum); difficult++; } villageMan.requestAccess(requests[random]); //请求失败后退出循环 if(requests[random].equals("我要告县长")){ System.out.println("休息三个月..."); break; } try { Thread.sleep(1000); } catch (final InterruptedException e) { e.printStackTrace(); } } } }
运行的效果:
2015-07-08 14:43:51我要告镇长 村长把处理请求转到上一级 2015-07-08 14:43:51我要告镇长 镇长把处理请求转到上一级 2015-07-08 14:43:51我要告镇长 县长处理了请求... 2015-07-08 14:43:52我要告村民 村长处理了请求... 2015-07-08 14:43:53我要告村民 村长处理了请求... 2015-07-08 14:43:54我要告镇长 村长把处理请求转到上一级 2015-07-08 14:43:54我要告镇长 镇长把处理请求转到上一级 2015-07-08 14:43:54我要告镇长 县长处理了请求... 2015-07-08 14:43:55我要告县长 回去吧,今天县长出差了。 2015-07-08 14:43:55我要告镇长 村长把处理请求转到上一级 2015-07-08 14:43:55我要告镇长 镇长把处理请求转到上一级 2015-07-08 14:43:55我要告镇长 县长处理了请求... 2015-07-08 14:43:56我要告镇长 村长把处理请求转到上一级 2015-07-08 14:43:56我要告镇长 镇长把处理请求转到上一级 2015-07-08 14:43:56我要告镇长 县长处理了请求... 2015-07-08 14:43:57我要告县长 回去吧,今天县长出差了。 2015-07-08 14:43:57我要告镇长 村长把处理请求转到上一级 2015-07-08 14:43:57我要告镇长 镇长把处理请求转到上一级 2015-07-08 14:43:57我要告镇长 县长处理了请求... 2015-07-08 14:43:58我要告镇长 村长把处理请求转到上一级 2015-07-08 14:43:58我要告镇长 镇长把处理请求转到上一级 2015-07-08 14:43:58我要告镇长 县长处理了请求... 2015-07-08 14:43:59我要告县长 回去吧,今天县长出差了。 2015-07-08 14:43:59我要告村民 村长处理了请求... 2015-07-08 14:44:00我要告县长 村长把处理请求转到上一级 2015-07-08 14:44:00我要告县长 镇长把处理请求转到上一级 2015-07-08 14:44:00我要告县长 哼...天高皇帝远.县长拒绝请求! 休息三个月... 2015-07-08 14:44:20我要告县长 回去吧,今天县长出差了。 2015-07-08 14:44:20我要告镇长 村长把处理请求转到上一级 2015-07-08 14:44:20我要告镇长 镇长把处理请求转到上一级 2015-07-08 14:44:20我要告镇长 县长处理了请求... 2015-07-08 14:44:21我要告村长 村长把处理请求转到上一级 2015-07-08 14:44:21我要告村长 镇长处理了请求... 2015-07-08 14:44:22我要告村民 村长处理了请求... 2015-07-08 14:44:23我要告村长 村长把处理请求转到上一级 2015-07-08 14:44:23我要告村长 镇长处理了请求... 2015-07-08 14:44:24我要告村长 村长把处理请求转到上一级 2015-07-08 14:44:24我要告村长 镇长处理了请求... 2015-07-08 14:44:25我要告村长 村长把处理请求转到上一级 2015-07-08 14:44:25我要告村长 镇长处理了请求... 2015-07-08 14:44:26我要告村长 村长把处理请求转到上一级 2015-07-08 14:44:26我要告村长 镇长处理了请求... 2015-07-08 14:44:27我要告村民 村长处理了请求... 2015-07-08 14:44:28我要告村民 村长处理了请求... 2015-07-08 14:44:29我要告村长 村长把处理请求转到上一级 2015-07-08 14:44:29我要告村长 镇长处理了请求... 2015-07-08 14:44:30我要告县长 回去吧,今天县长出差了。 2015-07-08 14:44:30我要告县长 回去吧,今天县长出差了。 2015-07-08 14:44:30我要告县长 村长把处理请求转到上一级 2015-07-08 14:44:30我要告县长 镇长把处理请求转到上一级 2015-07-08 14:44:30我要告县长 哼...天高皇帝远.县长拒绝请求! 休息三个月... 2015-07-08 14:44:50我要告村长 村长把处理请求转到上一级 2015-07-08 14:44:50我要告村长 镇长处理了请求... 2015-07-08 14:44:51我要告县长 回去吧,今天县长出差了。 2015-07-08 14:44:51我要告县长 回去吧,今天县长出差了。 2015-07-08 14:44:51我要告村长 村长把处理请求转到上一级 2015-07-08 14:44:51我要告村长 镇长处理了请求... 2015-07-08 14:44:52我要告镇长 村长把处理请求转到上一级 2015-07-08 14:44:52我要告镇长 镇长把处理请求转到上一级 2015-07-08 14:44:52我要告镇长 县长处理了请求... 2015-07-08 14:44:53我要告村长 村长把处理请求转到上一级 2015-07-08 14:44:53我要告村长 镇长处理了请求... 2015-07-08 14:44:54我要告村长 村长把处理请求转到上一级 2015-07-08 14:44:54我要告村长 镇长处理了请求... 2015-07-08 14:44:55我要告村民 村长处理了请求... 2015-07-08 14:44:56我要告镇长 村长把处理请求转到上一级 2015-07-08 14:44:56我要告镇长 镇长把处理请求转到上一级 2015-07-08 14:44:56我要告镇长 县长处理了请求... 2015-07-08 14:44:57我要告镇长 村长把处理请求转到上一级 2015-07-08 14:44:57我要告镇长 镇长把处理请求转到上一级 2015-07-08 14:44:57我要告镇长 县长处理了请求... 2015-07-08 14:44:58我要告县长 回去吧,今天县长出差了。 2015-07-08 14:44:58我要告村长 村长把处理请求转到上一级 2015-07-08 14:44:58我要告村长 镇长处理了请求... 2015-07-08 14:44:59我要告村民 村长处理了请求...
上一篇: php编译openssl模块的步骤