java责任链模式

摘要:
在现有的方式下就不得不新增处理方法,并且是在这个客户端的基础上进行新增。责任链模式实现这时候就到了责任链模式发挥作用了。该需求非常的符合对某一个对象、请求进行一系列处理的特征。

简单解释:简单来说就是该设计模式用于对某个对象或者请求进行一系列的处理,这些处理逻辑正好组成一个链条

传统实现

假设这样的场景:传入了一段内容,需要对这段文本进行加工;比如过滤敏感词、错别字修改、最后署上版权等操作。

常见的写法如下:

public class Main {

public static void main(String[] args) {

String msg = "内容内容内容" ;

String result = Process.sensitiveWord()

.typo()

.copyright();

}

}

这样看似没啥问题也能解决需求,但如果我还需要为为内容加上一个统一的标题呢?在现有的方式下就不得不新增处理方法,并且是在这个客户端( Process)的基础上进行新增。

显然这样的扩展性不好。

责任链模式实现

这时候就到了责任链模式发挥作用了。

该需求非常的符合对某一个对象、请求进行一系列处理的特征。

于是我们将代码修改:

这时 Process 就是一个接口了,用于定义真正的处理函数。

public interface Process {

/**

* 执行处理

* @param msg

*/

void doProcess(String msg) ;

}

同时之前对内容的各种处理只需要实现该接口即可:

java责任链模式第1张

然后只需要给客户端提供一个执行入口以及添加责任链的入口即可:

  1. publicclassMsgProcessChain{

  2. privateList<Process>chains =newArrayList<>();

  3. /**

  4. * 添加责任链

  5. * @param process

  6. * @return

  7. */

  8. publicMsgProcessChainaddChain(Processprocess){

  9. chains.add(process);

  10. returnthis;

  11. }

  12. /**

  13. * 执行处理

  14. * @param msg

  15. */

  16. publicvoidprocess(Stringmsg){

  17. for(Processchain :chains){

  18. chain.doProcess(msg);

  19. }

  20. }

  21. }

这样使用起来就非常简单:

  1. publicclassMain{

  2. publicstaticvoidmain(String[]args){

  3. Stringmsg ="内容内容内容==";

  4. MsgProcessChainchain =newMsgProcessChain()

  5. .addChain(newSensitiveWordProcess())

  6. .addChain(newTypoProcess())

  7. .addChain(newCopyrightProcess());

  8. chain.process(msg);

  9. }

  10. }

当我需要再增加一个处理逻辑时只需要添加一个处理单元即可( addChain(Processprocess)),并对客户端 chain.process(msg) 是无感知的,不需要做任何的改动。

免责声明:文章转载自《java责任链模式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[原][译][osg][osgEarth]飞行模拟软件JSBSim的操作(FGFCS类)Linux目录及常用命令下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

loadrunner之WebServices协议脚本编写(三种请求模式)

以天气预报网站为例:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl   一、web_service_call模式 步骤如下:   经过增加事务和if 判断的脚本如下: Action() { lr_start_transaction("获取天气预报"...

Java日期时间

Java日期时间 Java.util包提供了Date类来封装当前的日期和时间。Date类提供两个构造函数来实例化Date对象。 第一个构造函数使用当前日期和时间来初始化对象。 Date() 第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。 Date(long millisec) Date对象创建以后,可以调用下面的方法。   获...

SpringBoot入门 (四) 数据库访问之JdbcTemplate

  本文记录在SpringBoot中使用JdbcTemplate访问数据库。 一 JDBC回顾   最早是在上学时接触的使用JDBC访问数据库,主要有以下几个步骤: 1 加载驱动 Class.forName(Driver) 2 获取数据库连接 conn = DriverManager.getConnection(url, user,password) 3...

C# String小技巧

NET string 类是相当广泛的,然而仍有一些String函数是缺失的或者不是很明显,在使用Net String时,这里提供几个小技巧. 用重复的字符填充一个 String 为了用重复的字符填充一个字符串, 使用string 类的构造函数.例如:用20个(*)填充一个字符串. strings=newstring('*',20); 检查空字符串 一...

JDBC数据类型、Java数据类型、标准sql类型

本概述是从《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference》这本书中摘引来的。JavaSoft 目前正在准备这本书。这本书是一本教程,同时也是 JDBC 的重要参考手册,它将作为 Java 系列的组成部份,在 1997 年春季由 Addison-Wesley 出版...

【Android】让你的安卓app国际化、支持语言自动切换

碎碎念 我在写app的时候,无论是布局上的字符串还是代码中的,我都喜欢直接敲上去,无视那个善意提醒的波浪线。 对于小项目来说,我觉得无可厚非,虽然不规范但方便直观,不需要苦于给字符串起名字。 如果你在项目初期就想着要将应用推向国际市场,就要注意字符串一定要养成习惯全部写在string.xml里,不然后期再加真的很崩溃。 创建多语言的string.xml 我...