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中的多态与封装的具体实现具体设计(这不废话吗=- = 这些模式大多都是这样的)。在下半部分将会运用一些更加精巧的方式进行相关的过滤器的设计。

0 0
原创粉丝点击