设计模式之责任链模式(1)

入正题,需求:假如我想对一些信息进行一定规则的过滤.

首先定义一个Main类:

package cn.asto.filter;

public class Main {

    String str = "<script> hello 大家好! 敏感词汇!";
}

我想对javacript标签进行过滤,对敏感词汇进行过滤。

定义MsgProcessor:

package cn.asto.filter;

public class MsgProcessor {

    private String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String  process(){
        String result = msg.replace("<", "[").replace(">", "]");
        result = result.replace("敏感词汇", "根据法律,相关内容不能显示");
        return result;
    }
}

修改Main类:

package cn.asto.filter;

public class Main {

    public static void main(String args[]){
        String str = "<script> hello 大家好! 敏感词汇!";
        MsgProcessor msgProcessor = new MsgProcessor();
        msgProcessor.setMsg(str);
        String result = msgProcessor.process();
        System.out.println(result);
    }

}

输出:

[script] hello 大家好! 根据法律,相关内容不能显示!

看到html标签和敏感词汇被过滤掉了,很简单,就是定义了一个MsgProcessor,里面存一个msg,定义一个process方法用来替换相关字符,返回替换后的字符.

这和责任链还扯得有点远了。继续往下走。上面的做法,我们没办法决定MsgProcessor中处理链。每当有一个新的过滤需求,就得重写一个MsgProcessor,多扯淡。

现在定义一个Filer接口:

package cn.asto.filter;

public interface Filter {

    public String doFilter(String str);
}

写两个Filter类:

SensitiveFilter:

package cn.asto.filter;

public class SensitiveFilter implements Filter{

    @Override
    public String doFilter(String str) {
        String result = str.replace("敏感词汇", "根据法律,相关内容不能显示!");
        return result;
    }

}

HtmlFilter:

package cn.asto.filter;

public class HtmlFilter implements Filter{

    @Override
    public String doFilter(String str) {
        String result = str.replace("<", "[").replace(">", "]");
        return result;
    }

}

定义一个FilterChain(FilterChain中就对装入的msg,做遍历List<Filter>doFilter方法,返回处理的结果):

package cn.asto.filter;

import java.util.ArrayList;
import java.util.List;

public class FilterChain implements Filter {

    List<Filter> filters = new ArrayList<Filter>();
    public FilterChain addFilter(Filter f){
        filters.add(f);
        return this;
    }
    @Override
    public String doFilter(String str) {
        for(Filter filter :filters){
            str = filter.doFilter(str);
        }
        return str;
    }

}

此时在MsgFilter要干点什么呢?

装入一个msg(将要被处理的String),一条装上了几个Filter或者FilterChain的FilterChain,就可以了。

package cn.asto.filter;

public class MsgProcessor {

    private String msg;
    private FilterChain fc ;

    public String getMsg() {
        return msg;
    }

    public FilterChain getFc() {
        return fc;
    }

    public void setFc(FilterChain fc) {
        this.fc = fc;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
    public String  process(){
        return fc.doFilter(msg);
    }
}

在main方法中,定义一个装了几个Filter的FilterChain链,定义一个要被处理的字符串,作为参数传入msgProcessor对象,调用process()返回结果。

package cn.asto.filter;

public class Main {

    public static void main(String args[]){
        String str = "<script> hello 大家好! 敏感词汇!";

        FilterChain fc = new FilterChain();
        fc.addFilter(new HtmlFilter()).addFilter(new SensitiveFilter());

        MsgProcessor msgProcessor = new MsgProcessor();
        msgProcessor.setMsg(str);

        msgProcessor.setFc(fc);
        String result = msgProcessor.process();
        System.out.println(result);
    }

}

写到这里有点责任链的味道了。哈哈

上个图先:

创建HtmlFilter,SensitiveFilter实例化FilterChain,将msg和FilterChain实例化对象传入MsgProcessor构造msgProcessor,调用msgProcessor.process方法,实际上就是调用了FilterChain.doFilter,在往上说,就是遍历调用FilterChain中的HtmlFilter和SensitiveFilter的doFilter方法。实现讲完了。

来来来,我们来抽象一下过程。

一条msg经过一条FilterChain链条的磨练,通过了党中央宪法的校验,成为了一条合理合法的result!

这个FilterChain就是我们的责任链,这就是简单的责任链模式!

时间: 2024-08-21 04:50:19

设计模式之责任链模式(1)的相关文章

设计模式之责任链模式20170717

行为型设计模式之责任链模式: 一.含义 责任链模式的核心在"链"上,"链"是由多个处理者(对象)组成的,由这条链传递请求,直到有对象处理它为止(在链中决定谁来处理这个请求),并返回相应的结果 二.代码说明 1.主要有两个角色 1)处理者 它能够对请求做出处理(请求得到处理则直接返回,否则传到下一个处理者),设置下一个处理者(这两个操作可以抽象出来), 同时每个处理者都有一个相应的处理级别,以及具体的处理操作(父类实现请求传递,子类实现请求处理) 2)被处理者(请求者

设计模式之责任链模式--- Pattern chain-of-responsibility

模式的定义 责任链模式定义如下: Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it. 使多个对象都有机会处理请求,从而避免请求的发送

设计模式_责任链模式

定义 Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求.从而避免了请求的发送者和接受者之间的耦合关系.

Java设计模式之责任链模式、职责链模式

本文继续介绍23种设计模式系列之职责链模式. 什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组. 职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 角色 抽象处理者角色(Handler):定义出一个处理请求的接口.如果需要,接口可以定义 出一个方法以设定和返回对下家的引用.这个角色通常由一个Java抽象类或者Java接口实现. 具体处理者角色(ConcreteHan

C#设计模式:责任链模式

设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了,因为最近在设计“网关API”组件(后续介绍),采用“责任链设计模式”进行设计,所以先进行回顾记录.  一.责任链模式介绍 责任链模式是指一个处理需要涉及多个过程或者角色参与处理,并基于某个约定组成一个链,每个过程或者角色拥有各自职责进行处理.责任链模式有效组织一个过程处理,同时子过程之间职责明确.

【GOF23设计模式】责任链模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 1 package com.test.chainOfResp; 2 /** 3 * 封装请假的基本信息 4 */ 5 public class LeaveRequest { 6 private String empName; 7 private int leaveDays; 8 private String reason; 9 10 publi

Head First设计模式之责任链模式

一.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了. 何时使用:在处理消息的时候以过滤很多道. 如何解决:拦截的类都实现统一接口. 二.结构 从责任链模式的定义可以发现,责任链模式涉及的对象只有处理者角色,但由于有多个处理者,它们具有共同的处理请求的

23种设计模式之责任链模式(Chain of Responsibility)

责任链模式是一种对象的行为型模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止.责任链模式不保证每个请求都被接受,由于一个请求没有明确的接收者,那么就不能保证它一定会被处理. 优点: 1)降低了耦合度. 2)增加向对象指定责任的灵活性. 3)由于在一个类中产生的事件可以被发送到组成中的其它类处理器上,类的集合可以作为一个整体. 使用场景: 1)多个对象可以处理一个请求,而其处理器却是未知的. 2)想要在不指定确

五分钟一个设计模式之责任链模式

五分钟一个设计模式,用最简单的方法来描述设计模式.查看更多设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/category/3259443 请假流程 假设现在一个公司的请假流程如下:一天及以下由小组组长审批,一天以上三天以下由经理审批,三天以上七天以下由老板审批,七天以上直接劝退. 如果每次请假时都很长的if-else-来判断该去找谁请假,很不容易扩展,我们使用责任链模式来实现. 首先,是一个抽象的父类 public ab

入门设计模式之责任链模式

学习更多设计模式请参考:入门设计模式之汇总篇 责任链模式:很多对象由每一个对象对其下家的引用而连接起来行成的一条链. 其实责任链模式一直在我们的身边.某一天,董事长有个想法,他吩咐给了经理,经理吩咐给了组长,组长分配给了你我.这时候我们发现,我们没有下级了呀,咋办,那就干呗. 上方这个任务分配的过程就是责任链模式,一个事件会一直向下层传递,董事长并不关心是谁解决的这个问题,对他来说只要问题解决了就行. Handle:抽象处理者,可理解为抽象的员工(经理组长普通程序员等都是继承了员工) Handl