设计模式之ChainOfResponsibility:过滤Request和Response

    今天是学习设计模式的责任链,要求如下:

    模拟Java Web中的过滤器,实现对Requset消息和Response消息的过滤,且对Response消息的过滤顺序与对Request的过滤顺序正好相反,具体如下图所示。


    我们进行简单的模拟,创建Request和Reponse类,分别用于封装请求和响应消息。创建一个Filter接口,创建两个实现该Filter接口的过滤器HTMLFilter和SensitiveFilter,分别用于对消息进行简单的过滤处理。创建一个过滤器链FilterChain,在FilterChain中按序加入过滤器,FilterChain也实现Filter接口,这样便于两条过滤器链的连接。具体代码如下。

package com.zj.chain;

public class Request {
	private String requestStr;

	public String getRequestStr() {
		return requestStr;
	}

	public void setRequestStr(String requestStr) {
		this.requestStr = requestStr;
	}
}
package com.zj.chain;

public class Response {
	private String responseStr;

	public String getResponseStr() {
		return responseStr;
	}

	public void setResponseStr(String responseStr) {
		this.responseStr = responseStr;
	}
}
package com.zj.chain;

public interface Filter {
	void doFilter(Request request,Response response,FilterChain fc);
}
package com.zj.chain;

public class HTMLFilter implements Filter {
	@Override
	public void doFilter(Request request, Response response,FilterChain fc) {
		request.setRequestStr(request.getRequestStr().replaceAll("<", "[").replaceAll(">", "]")+"--HTML");
		fc.doFilter(request, response, fc);
		response.setResponseStr(response.getResponseStr().replaceAll("<", "[").replaceAll(">", "]")+"--HTML");
	}
}
package com.zj.chain;

public class SensitiveFilter implements Filter{
	@Override
	public void doFilter(Request request, Response response,FilterChain fc) {
		request.setRequestStr(request.getRequestStr().replaceAll("敏感", "").replace("被就业", "就业")+"--Sensitive");
		fc.doFilter(request, response, fc);
		response.setResponseStr(response.getResponseStr().replaceAll("敏感", "").replace("被就业", "就业")+"--Sensitive");
	}

}
package com.zj.chain;

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

public class FilterChain implements Filter{
	List<Filter> filters=new ArrayList<Filter>();
	int index=0;
	public FilterChain addFilter(Filter f){
		this.filters.add(f);
		return this;
	}

	@Override
	public void doFilter(Request request, Response response,FilterChain fc) {
		if(index==filters.size()) return;
		Filter f=filters.get(index);
		index++;
		f.doFilter(request, response, fc);	
	}
}
package com.zj.chain;

public class Main {
	
	public static void main(String[] args){
		String msg1="大家好,这是request的字符串,<script>,敏感,被就业,认真学习设计模式";
		String msg2="大家好,这是response的字符串,<script>,敏感,被就业,认真学习设计模式";

		FilterChain fc=new FilterChain();
		fc.addFilter(new HTMLFilter())
		  .addFilter(new SensitiveFilter());
	
		Request request=new Request();
		request.setRequestStr(msg1);
		Response response=new Response();
		response.setResponseStr(msg2);
		
		fc.doFilter(request, response,fc);
		System.out.println(request.getRequestStr());
		System.out.println(response.getResponseStr());
	}
}
    运行结果如下:

    从运行结果可以看出,对Response消息的过滤处理的顺序和对Request消息过滤处理的顺序正好相反。类的具体调用关系如下:

    本设计模式的巧妙之处在于doFilter(Request,Response,FilterChain)方法不仅带有请求和响应的参数,还带有过滤器链本身。FilterChain调用一个过滤器对request消息进行过滤处理后,使用过滤器链本身去调用下一个过滤器,直到所有的过滤器都调用完,再依次返回,逆序调用过滤器,从而实现了对Response消息的逆序过滤。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Request-Response 模式通常使用的是一种设计模式称为 "Command" 模式。该模式将请求封装为一个对象,从而使其能够以不同的参数和方法被传递,并且可以进行队列、记录和撤销操作。 下面是一个简单的示例代码,演示了如何使用 Command 模式来实现 Request-Response 模式: ```python from abc import ABC, abstractmethod # 命令接口 class Command(ABC): @abstractmethod def execute(self): pass # 请求对象 class Request: def __init__(self, data): self.data = data # 响应对象 class Response: def __init__(self, data): self.data = data # 具体命令类,处理请求并返回响应 class ConcreteCommand(Command): def __init__(self, request): self.request = request def execute(self): # 处理请求并返回响应 response_data = self.request.data.upper() return Response(response_data) # 请求处理器,用于接收请求并将其转换为命令对象 class RequestHandler: def handle_request(self, request): # 将请求转换为命令并执行 command = ConcreteCommand(request) response = command.execute() return response # 示例代码 if __name__ == '__main__': # 创建请求处理器和请求对象 handler = RequestHandler() request = Request('hello, world!') # 处理请求并输出响应 response = handler.handle_request(request) print(response.data) # 输出 "HELLO, WORLD!" ``` 在上面的示例代码中,`RequestHandler` 类接收请求对象并将其转换为 `ConcreteCommand` 命令对象,然后执行该命令并返回响应对象。`ConcreteCommand` 类封装了请求对象和处理方法,并实现了 `Command` 接口。 该示例代码演示了 Request-Response 模式的基本思想,即通过将请求和响应封装为对象来使其能够以更灵活的方式进行传递和处理。 ### 回答2: Request-Response 模式采用的设计模式是观察者模式(Observer Pattern)。 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象的状态发生变化时,会自动通知所有的观察者对象,使它们能够做出相应的处理。 在 Request-Response 模式中,请求方是观察者,它发送请求并等待响应;响应方是主题对象,它接收请求并生成响应。当响应方准备好响应时,它会通知所有的请求方,并将响应结果发送给它们。 以下是使用 Java 实现的简单示例代码: ```java // 定义观察者接口 interface RequestObserver { void receiveResponse(String response); } // 定义主题对象 class ResponseSubject { private List<RequestObserver> observers = new ArrayList<>(); public void addObserver(RequestObserver observer) { observers.add(observer); } public void removeObserver(RequestObserver observer) { observers.remove(observer); } public void generateResponse(String response) { for (RequestObserver observer : observers) { observer.receiveResponse(response); } } } // 定义请求方类,实现观察者接口 class Requester implements RequestObserver { private String name; public Requester(String name) { this.name = name; } public void sendRequest(ResponseSubject subject) { System.out.println(name + " 发送请求"); subject.addObserver(this); } @Override public void receiveResponse(String response) { System.out.println(name + " 收到响应:" + response); } } public class Main { public static void main(String[] args) { ResponseSubject subject = new ResponseSubject(); Requester requester1 = new Requester("请求方1"); Requester requester2 = new Requester("请求方2"); requester1.sendRequest(subject); requester2.sendRequest(subject); subject.generateResponse("这是响应内容"); subject.removeObserver(requester1); subject.generateResponse("另一个响应内容"); } } ``` 以上代码中,定义了一个 ResponseSubject 类作为主题对象,其中定义了添加观察者、移除观察者和生成响应的方法。Requester 类实现了 RequestObserver 接口,作为观察者,它可以发送请求并接收响应。在主函数中创建了一个主题对象和两个请求方对象,分别发送请求并接收响应。 ### 回答3: Request-Response 模式采用的设计模式是观察者模式(Observer Pattern)。 在 Request-Response 模式中,请求者(Requester)发送一个请求给接收者(Responder),并等待接收者给出对请求的回应。这个模式通过解耦请求者和接收者之间的关系,使得它们可以独立地进行修改和扩展。 以下是使用观察者模式实现 Request-Response 模式的一段简单代码: // 定义一个请求者接口 public interface Requester { void sendRequest(String request); void receiveResponse(String response); } // 定义一个接收者接口 public interface Responder { void handleRequest(String request); } // 实现请求者 public class ConcreteRequester implements Requester { private Responder responder; public void setResponder(Responder responder) { this.responder = responder; } public void sendRequest(String request) { responder.handleRequest(request); } public void receiveResponse(String response) { System.out.println("Received response: " + response); } } // 实现接收者 public class ConcreteResponder implements Responder { private Requester requester; public void setRequester(Requester requester) { this.requester = requester; } public void handleRequest(String request) { // 处理请求并生成响应 String response = "Response for request: " + request; requester.receiveResponse(response); } } // 客户端代码 public class Client { public static void main(String[] args) { Requester requester = new ConcreteRequester(); Responder responder = new ConcreteResponder(); requester.setResponder(responder); responder.setRequester(requester); requester.sendRequest("Hello, world!"); } } 以上代码演示了如何使用观察者模式实现 Request-Response 模式。在客户端代码中,请求者和接收者通过设置彼此的引用,建立了双向的联系。当请求者发送一个请求时,接收者会处理该请求并生成响应,最后请求者收到响应并进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值