Java设计模式学习(3)- Chain Of Responsibility模式 (上)
来源:互联网 发布:汉字书写教学软件 编辑:程序博客网 时间:2024/06/06 14:16
责任链模式是我最早学习的模式,所以这次的博文,我选了责任链模式来写。本人学习新的知识,通常是先进行学习,学习其中的思想,等过一阵子再来回想当初的思路,我觉得这样一来能够更加好的巩固当初学习的知识,二来是通常情况下,看完了学习视频立马就去编写代码其实只是短暂记忆的结果,我觉得这样进行不能够很很好巩固学习的知识,思想思路才是最关键的。每次写学习笔记博文的时候,我都是从零开始,按照思路重新构建一个实例,本人觉得这样的学习方式还算可以,大家觉得可行也可以采用这样的方式。
本次的实例,我将直接采用马士兵老师的字符串过滤器例子进行相关的练习。
责任链模式是我最早学习的模式,在此之前,其实我们早已经碰到过这样的情况了:我们在论坛上,或者是贴吧里面,通常通过回帖等,输入一串字符串,对于一个字符串,它其中包含了种种符号、文字,但是当你把这串字符串发送到服务器端的时候,他不是直接就上传给服务器,而是会采取一定的字符串替换删除等操作,也就是我们通常意义上的“和谐”。那么我们首先来模拟一下这个过程,如下:
首先,主函数里面我们写上一个字符串,并且创建MsgProcessor类,里面添加静态方法process用于处理字符串,该方法的作用是把字符串中的表情符号替换,如下:
public class MsgProcessor { public static String process(String str) { return str.replace(":)", "^-^"); }}public class Main { public static void main(String[] args) { String testStr = "大家好,:),我很帅"; testStr = MsgProcessor.process(testStr); System.out.println(testStr); }}
结果如下:
大家好,^-^,我很帅
目前功能是没有问题的。好了,问题来了我现在还想要把“帅”字和谐成为“*”,怎么办?有人会说,直接在方法里写新的过滤规则不就行了吗?或者是写一些新静态的方法来实现过滤规则。解决是没有错的,但是,面对成千上百种的过滤规则,面对一个已经封装好了的类,你想一想你能够随便修改类的相关方法吗?你能够在这个 MsgProcessor类中去不断添加相关的方法吗?很显然,这就失去了OO多态的灵活性了。
我们在process方法中能不能用某种能够帮助你实现过滤的对象来处理呢?
看下面的代码,创建一个接口,他有一个方法就叫process:
public interface Filter { String process(String str);}
然后,我们写一个FaceFilter实现这个接口并且实现这其中的方法:
public class FaceFilter implements Filter { public String process(String str) { return str.replace(":)", "^-^"); }}
Ok,针对于一些系列的Filter我可以在MsgProcess里面创建一个Filter数组,用于存放这些Filter,同时修改该类中的process方法,对于遍历Filter数组中的不同类型的Filter进行各自的process处理:
public class MsgProcessor { Filter[] filters = {new FaceFilter() }; public String process(String str) { String tempStr = str; for(Filter f : filters) { tempStr = f.process(tempStr); } return tempStr; }}
然后修改主程序:
public class Main { public static void main(String[] args) { String testStr = "大家好,:),我很帅"; MsgProcessor msp = new MsgProcessor(); testStr = msp.process(testStr); System.out.println(testStr); }}
运行结果是没有问题的:
大家好,^-^,我很帅
好了,每次如果我想使用的新的过滤规则,只需要实现Filter接口,进行具体的过滤规则的编写,然后再Filter数组里面的new出来就可以了,甚至这一系列的过滤规则的顺序你也可以自定义。
那么接下来又有一个问题了,如果我现在已经有一系列的过滤规则,同时,我又想添加一系列的过滤规则,注意,我说的是一系列,怎么办?
责任链就在此体现出来了。我们创建一个新的类叫ChainOfFilter,作为一系列Filter的责任链,其中会包含一个Filter类型的ArrayList一些列的Filter,同时自己这条链怎么加其他的链呢?只需要这个链也实现Filter接口就行了,如下:
public class ChainOfFilter implements Filter{ private List<Filter> chainFilter = new ArrayList<Filter>(); public void setChainFilter(Filter filter) { chainFilter.add(filter); } public String process(String str) { String tempStr = str; for(Filter cf : chainFilter) { tempStr = cf.process(tempStr); } return tempStr; }}
接下来就是给MsgProcess中添加ChainOfFilter类型的成员,同时修改该类中的方法,把具体的process方法交给这个Filter链自身的process自己去实现,如下:
public class MsgProcessor { ChainOfFilter cof = null; public void setFilter(Filter f) { cof.addFilter(f); } public String process(String str) { return cof.process(str); }}
然后再次修改main方法中的相关步骤,如下:
public class Main { public static void main(String[] args) { String testStr = "大家好,:),我很帅"; MsgProcessor msp = new MsgProcessor(); msp.addFilter(new FaceFilter()); testStr = msp.process(testStr); System.out.println(testStr); }}
对于这个我们再创建两个新的过滤规则,把这两个新的过滤规则添加到两个新的过滤链中,并添加到原来的MsgProcess中去,如下:
两个新的过滤器分别叫SensitiveFilter、TailFilter,分别是和谐“帅”字并添加小尾巴,如下:
public class SensitiveFilter implements Filter { public String process(String str) { return str = str.replace("帅", "*"); }}public class TailFilter implements Filter { public String process(String str) { return str = str.replace(str, str + "---myTail"); }}
然后在main函数中传建一个新的ChainOfFilter并把这两个Filter添加进去,然后再添加如原来的那个MsgProcess中,如下:
public class Main { public static void main(String[] args) { String testStr = "大家好,:),我很帅"; MsgProcessor msp = new MsgProcessor(); msp.addFilter(new FaceFilter()); ChainOfFilter cof = new ChainOfFilter(); cof.addFilter(new SensitiveFilter()); cof.addFilter(new TailFilter()); msp.addFilter(cof); testStr = msp.process(testStr); System.out.println(testStr); }}
结果如下:
大家好,^-^,我很*---myTail
好了目前一个比较完整的责任链模式实例就是这样的了。但是,这只是一般的情况下,我们其实从这个练习中可以看出来还是各种类之间的聚合关系,一层一层的不断封装。因为这次的是责任链模式基本部分。还有很关键的一部分我将会留在下中进行相关的讲述练习。就是在服务器与客户端之间的信息传递(我们还是用String进行传递),这其中的过滤器的设置问题。
心得
本次的责任链的基本部分的学习在我看来,归根到底还是对于OO中的多态与封装的具体实现具体设计(这不废话吗=- = 这些模式大多都是这样的)。在下半部分将会运用一些更加精巧的方式进行相关的过滤器的设计。
- Java设计模式学习(3)- Chain Of Responsibility模式 (上)
- Java设计模式学习(3)- Chain Of Responsibility模式 (下)
- Java设计模式----责任链模式(Chain of Responsibility)
- 设计模式学习笔记---职责链模式chain of responsibility(Java版)
- 设计模式学习17 Chain Of Responsibility
- JAVA设计模式-Chain of Responsibility
- JAVA设计模式-Chain of Responsibility
- 设计模式-职责链模式(chain of Responsibility)
- 浅谈设计模式:责任链模式(Chain Of Responsibility)
- 设计模式:行为模式:职责链(chain of responsibility)
- 设计模式之Chain of Responsibility模式(笔记)
- 设计模式之职责链模式(Chain Of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- 设计模式之---责任链模式(Chain of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- Chain of Responsibility模式详解--设计模式(21)
- 设计模式:责任链模式(Chain of Responsibility)
- 设计模式(17)-责任链模式(Chain of Responsibility)
- [HDU 1116]Play on Words(欧拉回路/欧拉路径+并查集)
- Angular2 单页应用的编写 by 嗡
- Oracle Data Guard 主库 归档文件 删除策略
- Navicat 创建数据库和表之使用命令创建
- 冒泡排序
- Java设计模式学习(3)- Chain Of Responsibility模式 (上)
- HDU 2601 An easy problem (数论)
- 慧眼云:基于云计算和大数据分析的主动防御实践
- abp及实战框架概述
- 20170219am js
- NRF24L01 使用小结/自动应答/通道地址
- 系统的延时及定时机制
- Integer位操作技巧解析
- js跨域原理