zoukankan      html  css  js  c++  java
  • 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) ;

    }

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

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

    1. public class MsgProcessChain {

    2.    private List<Process> chains = new ArrayList<>() ;

    3.    /**

    4.     * 添加责任链

    5.     * @param process

    6.     * @return

    7.     */

    8.    public MsgProcessChain addChain(Process process){

    9.        chains.add(process) ;

    10.        return this ;

    11.    }

    12.    /**

    13.     * 执行处理

    14.     * @param msg

    15.     */

    16.    public void process(String msg){

    17.        for (Process chain : chains) {

    18.            chain.doProcess(msg);

    19.        }

    20.    }

    21. }

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

    1. public class Main {

    2.    public static void main(String[] args) {

    3.        String msg = "内容内容内容==" ;

    4.        MsgProcessChain chain = new MsgProcessChain()

    5.                .addChain(new SensitiveWordProcess())

    6.                .addChain(new TypoProcess())

    7.                .addChain(new CopyrightProcess()) ;

    8.        chain.process(msg) ;

    9.    }

    10. }

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

  • 相关阅读:
    I/O会一直占用CPU吗?【转载】
    CPU和线程的关系
    future封装了callable,thread封装future。
    (转)Java中的守护线程
    线程中sleep方法和wait方法有什么区别?(转)
    Java异常---获取异常的堆栈信息
    分析iOS Crash文件,使用命令符号化iOS Crash文件
    String Matching(poj1580)
    U转串口驱动安装
    [LNU.Machine Learning.Question.1]梯度下降方法的一些理解
  • 原文地址:https://www.cnblogs.com/coderdxj/p/9828242.html
Copyright © 2011-2022 走看看