【设计模式】责任链3-横刀植入

紧接着上一篇的开始:
我们来说说普遍的解决方案,我们用一个类来模拟:
这个类模拟一个够过滤器链条:

package cn.edu.hpu.responsibility;

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

public class FilterChain {
	List<Filter> filters=new ArrayList<Filter>();

	//返回值是FilterChain只为了在Main中满足链条式的编程
	public FilterChain addFilter(Filter f) {
		this.filters.add(f);
		return this;
	}
}

可以添加过滤器。
我们如果把这个过滤器链条类看成一个“黑盒子”的话,它也算是一个巨大的过滤器。
于是它也应该有这个方法:

public String doFilter(String str) {
	String r=str;
	for(Filter f:filters){
		r=f.doFilter(r);
        }

	return r;
}

也就是:

package cn.edu.hpu.responsibility;

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

public class FilterChain {
	List<Filter> filters=new ArrayList<Filter>();

	//返回值是FilterChain只为了在Main中满足链条式的编程
	public FilterChain addFilter(Filter f) {
		this.filters.add(f);
		return this;
	}

	public String doFilter(String str) {
		String r=str;
		for(Filter f:filters){
			r=f.doFilter(r);
		}

		return r;
	}
}

当我们有FilterChain这个类的时候,MsgProcessor就会有些变化:

package cn.edu.hpu.responsibility;

public class MsgProcessor {
	private String msg;

	//把众多的过滤规则(不同的过滤器)整合在一起
	//Filter[] filters={new HTMLFilter(),new SesitiveFilter()};
	FilterChain fc;

	public String getMsg() {
		return msg;
	}

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

	public FilterChain getFc() {
		return fc;
	}

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

	public String process(){
		//处理脚本语句和敏感字眼
		return fc.doFilter(msg);
	}
}

在Main中就应该这么写了:

package cn.edu.hpu.responsibility;

public class Main {
	public static void main(String[] args) {
		String msg="大家好:),<script>,偷盗,抢劫,我们要把设计模式学好";
		MsgProcessor mp=new MsgProcessor();
		mp.setMsg(msg);
		FilterChain fc=new FilterChain();
		fc.addFilter(new HTMLFilter())
		  .addFilter(new SesitiveFilter());//链条式写法
		mp.setFc(fc);
		String result=mp.process();
		System.out.println(result);
	}
}

运行结果:
大家好:),[script],和谐,帮助,我们要把设计模式学好

然后你不想要那个过滤规则了,就把.addFilter(new XxxxxFilter())去掉。或者写在配置文件里,直接改写配置文件就可以了。

过程解析图(FilterChain结构图):

接下来问题就是,我如何在原来的FilterChain中加入另外一个FilterChain呢?
很简单,让FilterChain去实现Filter接口:
public class FilterChain implements Filter{.......

现在我们加一个笑脸过滤器:

package cn.edu.hpu.responsibility;

public class FaceFilter implements Filter {

	@Override
	public String doFilter(String str) {
		//笑脸过滤器
		String r=str.replace(":)", "^_^");
		return r;
	}

}

假设笑脸处理器属于第二个过滤器链条(FilterChain),我们在Main中来组合它们:

package cn.edu.hpu.responsibility;

public class Main {
	public static void main(String[] args) {
		String msg="大家好:),<script>,偷盗,抢劫,我们要把设计模式学好";
		MsgProcessor mp=new MsgProcessor();
		mp.setMsg(msg);
		FilterChain fc=new FilterChain();
		fc.addFilter(new HTMLFilter())
		  .addFilter(new SesitiveFilter());//链条式写法

		FilterChain fc2=new FilterChain();
		fc2.addFilter(new FaceFilter());

		fc.addFilter(fc2);
		mp.setFc(fc);
		String result=mp.process();
		System.out.println(result);
	}
}

测试结果:
大家好^_^,[script],和谐,帮助,我们要把设计模式学好

下面我们考虑是这样的,在这里我们只是消息从过滤链这头发到了过滤链那头,直白点就是从客户端发到服务器端,一般来说服务器端也会给客户端一个反馈。那么假如说我想做一个从客户端到服务器端的过滤且从服务器端到客户端的过滤的链条,可行吗?如何实现?

重新写一些过滤器倒着去过滤服务器端的信息也不是不可以,但是代码会冗余。
我们的过滤器应该既处理过去的消息,又处理回来的消息。

好了,这样的代码该如何组织呢?

思路:
我们先写两个类,一个封装请求,一个封装反馈(模拟JavaWeb):
Request和Response类

package cn.edu.hpu.filter.web;

public class Request {
	private String requestStr;

	public String getRequestStr() {
		return requestStr;
	}

	public void setRequestStr(String requestStr) {
		this.requestStr = requestStr;
	}

}

package cn.edu.hpu.filter.web;

public class Response {
	private String responseStr;

	public String getResponseStr() {
		return responseStr;
	}

	public void setResponseStr(String responseStr) {
		this.responseStr = responseStr;
	}

}

现在我们的想法是这样的,如果我们把Request对象和Response对象交给处理器的话,这个处理器既能把request对象处理,又能处理回来的response对象。这个事情该怎么办呢?

下一篇总计继续:http://blog.csdn.net/acmman/article/details/44673483

转载请注明出处:http://blog.csdn.net/acmman/article/details/44673409

时间: 2024-09-20 08:55:58

【设计模式】责任链3-横刀植入的相关文章

iOS设计模式 - 责任链

iOS设计模式 - 责任链   原理图   说明 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任.   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // ChainOfResponsibilityProtocol.h // C

13、Python与设计模式--责任链模式

一.请假系统 假设有这么一个请假系统:员工若想要请3天以内(包括3天的假),只需要直属经理批准就可以了:如果想请3-7天,不仅需要直属经理批准,部门经理需要最终批准:如果请假大于7天,不光要前两个经理批准,也需要总经理最终批准.类似的系统相信大家都遇到过,那么该如何实现呢?首先想到的当然是if-else-,但一旦遇到需求变动,其臃肿的代码和复杂的耦合缺点都显现出来.简单分析下需求,"假条"在三个经理间是单向传递关系,像一条链条一样,因而,我们可以用一条"链"把他们进

Java设计模式--责任链模式

责任链模式 使多个对象都有机会都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. Chain of Responsibility Pattern A void coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiv

设计模式之禅之设计模式-责任链模式

一:责任链模式的定义        --->使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.        --->责任链模式的重点是在"链"上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果        --->一般会有一个封装类对责任模式进行封装,也就是替代Client类,直接返回链中的第一个处理者,具体链的设置不需要高层次模块关系,这样,更简化了

实例讲解Java的设计模式编程中责任链模式的运用_java

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.类型:行为类模式类图: 首先来看一段代码: public void test(int i, Request request){ if(i==1){ Handler1.response(request); }else if(i == 2){ Handler2.response(request); }else if(i == 3){ Handler3.r

详解C++设计模式编程中责任链模式的应用_C 语言

职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 其思想很简单,比如考虑员工要求加薪.公司的管理者一共有三级,总经理.总监.经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监.总监的处理方式也一样,总经理可以处理所有请求.这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求.给出这个例子的UML图.

学习JavaScript设计模式之责任链模式_javascript技巧

一.定义 责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 二.示例 假设这么一个场景: 我们负责一个售卖手机的电商网站,经过分别缴纳500元定金和200元定金的两轮预定后,到了正式购买阶段.针对预定用户实行优惠,支付过500元定金的用户会收到100元的商城优惠券,支付过200元定金的用户会收到50元的商城优惠券,没有支付定金的用户归为普通购买,且在库存有限的情况下不一定保证买到. /*

浅谈简单工作流设计——责任链模式配合策略与命令模式的实现

本文以项目中的一个工作流模块,演示责任链模式.策略模式.命令模式的组合实现! 流程简介 最近在做的一个项目,涉及到的是一个流程性质的需求.关于工程机械行业的服务流程:服务任务流程和备件发运流程. 项目之初,需求不是很清晰,算是演化模型吧.先出一个简单版本,然后根据用户的使用情况,再进一步探测新需求.所以也就是说这两个流程中的每一步暂时都不是固定的,而应该是可配置.可增减的. 目前暂定的两个流程示意图如下: 以上为两个流程的大致过程,当然实际过程中,可能还要走其他的流程. 但是,仔细分析,你会看到

轻松掌握java责任链模式_java

定义:责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式.在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 特点:1.降低耦合度.它将请求的发送者和接收者解耦.              2.简化了对象.使得对象不需要知道链的结构.              3.增强给

详解java设计模式之责任链模式

从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正.开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒. 假比说,贾母.贾赦.贾政.贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链.击鼓者将花传给贾母,开始传花游戏.花由贾母传给贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又由贾宝玉传给贾环,由贾环传回给贾母,如此往复(见下图).当鼓声停止时,手中有花的人就得执行酒令. 图1.击鼓传