Java设计模式---ChainOfResponsibility责任链模式
参考于 :
大话设计模式
马士兵设计模式视频
代码参考于马士兵设计模式视频
写在开头:职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系
图来自大话设计模式,下面我的代码中,Clien是t依赖于Handler1和Handler2的,不过可以使用配置文件或者直接给Filter集合初始化来解决这种依赖。
1.场景
在网上评论一句话,往往会经过一系列的处理,有没有敏感词之类,现在我们来模拟一下。
把<html>,o.o,和谐
换成 [html],^v^,/*河蟹*/
2.不使用职责链模式
- package com.dingyu.ChainOfResponsibility;
- /**
- * 重点在于模式,故逻辑暂时不考虑
- *
- * @author dingyu
- *
- */
- public class Client01 {
- public static void main(String[] args) {
- String s = "<html>,o.o,和谐";
- s = s.replace("<", "[").replace(">", "]").replace("和谐", "/*河蟹*/").replace("o.o", "^v^");
- System.out.println(s);
- }
- }
缺点:过滤无法复用,无法记录过滤顺序。
3.使用职责链模式
- package com.dingyu.ChainOfResponsibility;
- /**
- * 过滤器,doFilter处理msg字符串
- * @author dingyu
- *
- */
- public interface Filter {
- public String doFilter(String msg);
- }
- package com.dingyu.ChainOfResponsibility;
- /**
- * 处理html符号
- * 测试用的,逻辑不是很严谨
- * @author dingyu
- *
- */
- public class HTMLFilter implements Filter {
- @Override
- public String doFilter(String msg) {
- return msg.replace("<", "[").replace(">", "]");
- }
- }
- package com.dingyu.ChainOfResponsibility;
- /**
- * 过滤敏感词汇
- * @author dingyu
- *
- */
- public class SensitiveWordFilter implements Filter {
- @Override
- public String doFilter(String msg) {
- return msg.replace("和谐", "/*河蟹*/");
- }
- }
- package com.dingyu.ChainOfResponsibility;
- /**
- * 处理符号
- * @author dingyu
- *
- */
- public class SymbolFilter implements Filter {
- @Override
- public String doFilter(String msg) {
- return msg.replace("o.o", "^v^");
- }
- }
- package com.dingyu.ChainOfResponsibility;
- import java.util.ArrayList;
- import java.util.List;
- public class Client {
- private static List<Filter> filters = new ArrayList<Filter>();
- private static int index = 0;
- public static void main(String[] args) {
- String s = "<html>,o.o,和谐";
- filters.add(new HTMLFilter());
- filters.add(new SymbolFilter());
- filters.add(new SensitiveWordFilter());
- for (Filter filter : filters) {
- s = filter.doFilter(s);
- }
- System.out.println(s);
- }
- }
虽然使用职责链模式,但仍然有缺点,上面的顺序是先HTML,然后Symbol,最后SensitiveWord,这三个构成一个过滤链条,如果有一天我需要把另一个过滤链条插入到这根链条中间,实现起来很麻烦。
4.改进职责链模式
- package com.dingyu.ChainOfResponsibility;
- import java.util.ArrayList;
- import java.util.List;
- /**
- *
- * @author dingyu
- *
- */
- public class FilterChain implements Filter {
- private List<Filter> filters = new ArrayList<Filter>();
- public void add(Filter filter) {
- filters.add(filter);
- }
- public List<Filter> getFilters() {
- return filters;
- }
- @Override
- public String doFilter(String msg) {
- for (Filter filter : filters) {
- msg = filter.doFilter(msg);
- }
- return msg;
- }
- }
- package com.dingyu.ChainOfResponsibility;
- import java.util.ArrayList;
- import java.util.List;
- public class Client {
- // private static List<Filter> filters = new ArrayList<Filter>();
- public static void main(String[] args) {
- String s = "<html>,o.o,和谐";
- // 链条1
- FilterChain chain1 = new FilterChain();
- chain1.add(new HTMLFilter());
- // 链条2
- FilterChain chain2 = new FilterChain();
- chain2.add(new HTMLFilter());
- chain2.add(new SensitiveWordFilter());
- // 链条2插到链条1后
- chain1.add(chain2);
- chain1.add(new SymbolFilter());
- s = chain1.doFilter(s);
- System.out.println(s);
- // filters.add(new HTMLFilter());
- // filters.add(new SymbolFilter());
- // filters.add(new SensitiveWordFilter());
- // for (Filter filter : filters) {
- // s = filter.doFilter(s);
- // }
- // System.out.println(s);
- }
- }
建议debug , eclipse快捷键
5. 职责链实现双向过滤
思路类似于递归,建议使用debug一步步调试。
- package com.dingyu.ChainOfResponsibility;
- /**
- * 过滤器,doFilter处理msg字符串
- *
- * @author dingyu
- *
- */
- public interface Filter {
- // public String doFilter(String msg);
- public void doFilter(Request request, Reponse reponse, FilterChain filterChain);
- }
- package com.dingyu.ChainOfResponsibility;
- /**
- * 处理html符号 测试用的,逻辑不是很严谨
- *
- * @author dingyu
- *
- */
- public class HTMLFilter implements Filter {
- @Override
- public void doFilter(Request request, Reponse reponse, FilterChain filterChain) {
- request.getRequestMsg().replace("<", "[").replace(">", "]");
- filterChain.doFilter(request, reponse, filterChain);
- reponse.setReponseMsg(reponse.getReponseMsg() + "-----HTMLFilter");
- }
- // @Override
- // public String doFilter(String msg) {
- // return msg.replace("<", "[").replace(">", "]");
- // }
- }
- package com.dingyu.ChainOfResponsibility;
- /**
- * 过滤敏感词汇
- *
- * @author dingyu
- *
- */
- public class SensitiveWordFilter implements Filter {
- @Override
- public void doFilter(Request request, Reponse reponse, FilterChain filterChain) {
- request.getRequestMsg().replace("和谐", "/*河蟹*/");
- filterChain.doFilter(request, reponse, filterChain);
- reponse.setReponseMsg(reponse.getReponseMsg() + "-----SensitiveWordFilter");
- }
- // @Override
- // public String doFilter(String msg) {
- // return msg.replace("和谐", "/*河蟹*/");
- // }
- }
- package com.dingyu.ChainOfResponsibility;
- /**
- * 处理符号
- *
- * @author dingyu
- *
- */
- public class SymbolFilter implements Filter {
- @Override
- public void doFilter(Request request, Reponse reponse, FilterChain filterChain) {
- request.getRequestMsg().replace("o.o", "^v^");
- filterChain.doFilter(request, reponse, filterChain);
- reponse.setReponseMsg(reponse.getReponseMsg() + "-----SymbolFilter");
- }
- // @Override
- // public String doFilter(String msg) {
- // return msg.replace("o.o", "^v^");
- // }
- }
- package com.dingyu.ChainOfResponsibility;
- import java.util.ArrayList;
- import java.util.List;
- /**
- *
- * @author dingyu
- *
- */
- public class FilterChain implements Filter {
- private List<Filter> filters = new ArrayList<Filter>();
- private int index=-1;
- public void add(Filter filter) {
- filters.add(filter);
- }
- public List<Filter> getFilters() {
- return filters;
- }
- // @Override
- // public String doFilter(String msg) {
- // for (Filter filter : filters) {
- // msg = filter.doFilter(msg);
- // }
- // return msg;
- // }
- @Override
- public void doFilter(Request request, Reponse reponse, FilterChain filterChain) {
- if (index == filters.size()-1)
- return;
- index++;
- filters.get(index).doFilter(request, reponse, filterChain);
- }
- }
- package com.dingyu.ChainOfResponsibility;
- public class Client03 {
- public static void main(String[] args) {
- Request request = new Request();
- Reponse reponse = new Reponse();
- request.setRequestMsg("<html>,o.o,和谐");
- reponse.setReponseMsg("hahahahaha");
- FilterChain chain = new FilterChain();
- chain.add(new HTMLFilter());
- chain.add(new SensitiveWordFilter());
- chain.add(new SymbolFilter());
- chain.doFilter(request, reponse, chain);
- System.out.println(request.getRequestMsg());
- System.out.println(reponse.getReponseMsg());
- }
- }
Java设计模式---ChainOfResponsibility责任链模式的更多相关文章
- 详解java设计模式之责任链模式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...
- Java设计模式之责任链模式、职责链模式
本文继续介绍23种设计模式系列之职责链模式. 什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组. 职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间 ...
- JAVA设计模式之责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- Java设计模式之八 ----- 责任链模式和命令模式
前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...
- Java设计模式应用——责任链模式
生产一个产品,需要依次执行多个步骤,才能完成,那么是使用责任链模式则是极好的. 在性能告警模块开发过程中,创建一条告警规则需要执行阈值解析,中间表生成,流任务生成,规则入库,告警事件入库等诸多操作.如 ...
- java设计模式之责任链模式(Chain of Responsibility)
转自:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开头是这样 ...
- java设计模式之责任链模式以及在java中作用
责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...
- 击鼓传花联想到了Java设计模式:责任链模式
目录 应用场景 简单示例 责任链模式 定义 意图 主要解决问题 何时使用 优缺点 击鼓传花的故事 应用场景 http web请求处理,请求过来后将经过转码.解析.参数封装.鉴权等一系列的处理(责任), ...
- 【java设计模式】责任链模式
可以随时添加过滤器,并在主方法中添加删除: Main package com.tn.filter; public class Main { public static void main(String ...
随机推荐
- 自己动手编译Android(LineageOS)源码
准备 设备:红米3s 设备代号:land Android版本:7.1.1 源码提供:Lineage PC配置: 系统:Ubuntu16.04 x64 至少12G RAM 至少80GB 剩余硬盘空间 良 ...
- mpvue 小程序开发爬坑汇总
<!-- 小程序的爬坑记录 --> 1 微信小程序之动态获取元素宽高 var obj=wx.createSelectorQuery(); 2 微信小程序图片自适应 <image cl ...
- Python调用ansible API系列(四)动态生成hosts文件
方法一:通过最原始的操作文件的方式 #!/usr/bin/env python # -*- coding: utf-8 -*- """ 通过操作文件形式动态生成ansib ...
- 关于数据库管理系统DBMS--关系型数据库(MySQL/MariaDB)
数据库的结构(3种):层次,网状,关系型(用的最多): DBMS的三层模型: 视图层:面向最终用户: 逻辑层:面向程序员或DBA: 物理层:面向系统管理员: 关系型数据库管理系统——RDBMS: 主要 ...
- vue之$root,$parent
$root vue状态管理使用vuex,如果项目不大,逻辑不多,name我们没必要用vuex给项目增加难度,只需要用$root设置vue实例的data就行了,如下 main.js new Vue({ ...
- 实验二 request、out对象使用
request.out对象使用 一.实验目的 1.掌握代码片段中的注释的应用: 2.掌握JSP脚本标示---Java代码片段的应用. 二.实验内容 1.设计教师与学生不同登陆界面,如下图: 2.验证码 ...
- openlayers4 入门开发系列之地图标绘篇(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- 关于ORACLE的SQL语句拼接、替换、截取、排序,联表等...~持续汇总~
先看一下所有的数据.这里全部为VARCHAR2(255). 字段拼接 在所有的性别后面加% 字段替换,把性别TPF_SEX去除百分号% 字段截取 字段截取+拼接 字段替换,这里把百分号%替换为空,也 ...
- 第九周LINUX 学习笔记
基于GTID的mysql主从简单复制 一.简单主从模式配置步骤1.配置主从节点的服务配置文件1.1.配置master节点:[mysqld]binlog-format=ROWlog-bin=master ...
- vue 对列表数组删除和增加
很重要,一定要好好研究 https://cn.vuejs.org/v2/guide/list.html#%E6%9B%BF%E6%8D%A2%E6%95%B0%E7%BB%84