设计模式(一)Chain Of Responsibility责任链模式
設(shè)計(jì)模式篇章,源于網(wǎng)課的學(xué)習(xí),以及個(gè)人的整理
?
在我們接收用戶(hù)提交的字符時(shí),常常會(huì)使用到過(guò)濾,在學(xué)習(xí)責(zé)任鏈模式前,我們是這樣做的
1.定義一個(gè)類(lèi)
public class MsgProcesser {String msg;public MsgProcesser(String msg) {this.msg=msg;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public String process() {String r=msg.replace("<", "[").replaceAll(">", "]");r=r.replaceAll("被就業(yè)", "就業(yè)");r=r.replaceAll("敏感", "");return r;} }測(cè)試
public static void main(String[] args) {String message="大家好:),<script>,敏感,被就業(yè),網(wǎng)絡(luò)授課沒(méi)感覺(jué),因?yàn)榭床灰?jiàn)大家伙兒";MsgProcesser mp=new MsgProcesser(message);System.out.println(mp.process());}往往添加數(shù)據(jù)會(huì)很不方便,于是,借用責(zé)任鏈的方式,我們可以這樣寫(xiě)
?1.定義一個(gè)接口,內(nèi)部有抽象方法doFilter
package com.littlepage.testChainOfResponsibility;public interface Filter {String doFilter(String str); }2.定義一些不同的過(guò)濾器類(lèi)實(shí)現(xiàn)過(guò)濾器接口,類(lèi)似HTMLFilter,SensitiveFilter
package com.littlepage.testChainOfResponsibility;public class HTMLFilter implements Filter{@Overridepublic String doFilter(String str) {return str.replaceAll("<", "[").replaceAll(">", "]"); }} package com.littlepage.testChainOfResponsibility;public class SensitiveFilter implements Filter{@Overridepublic String doFilter(String str) {return str.replaceAll("敏感", "*");}}3.進(jìn)行主要鏈條的編寫(xiě),就是新建一個(gè)類(lèi)叫MsgProcesser,該類(lèi)將這些方法進(jìn)行串起來(lái),使用foreach循環(huán)進(jìn)行迭代進(jìn)行過(guò)濾,在后續(xù)情況下,也就是說(shuō),你需要再添加過(guò)濾的關(guān)鍵字,就可以直接新建一個(gè)鏈條上的小塊(也就是一個(gè)類(lèi)),進(jìn)行添加,而不用再去寫(xiě)其他東西
package com.littlepage.testChainOfResponsibility;public class MsgProcesser {Filter[] filter= {new HTMLFilter(),new SensitiveFilter()};String msg;public MsgProcesser(String msg) {this.msg=msg;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public String process() {String r=msg;for(Filter f:filter) {r=f.doFilter(r);}return r;} }圖示:
或者說(shuō),你依然可以定義一個(gè)責(zé)任鏈類(lèi)(FilterChain)用來(lái)代替MsgProcesser類(lèi),里面用ArrayList容器盛放filter
該代碼為:
package com.littlepage.testChainOfResponsibility;import java.util.ArrayList; import java.util.List;public class FilterChain {List<Filter> filters=new ArrayList<>();public FilterChain addFilter(Filter f) {filters.add(f);return this;}public String doFilter(String str) {String r=str;for (Filter filter : filters) {r=filter.doFilter(r);}return r;} }主方法的調(diào)用改為
package com.littlepage.testChainOfResponsibility;public class Main {public static void main(String[] args) {String message="大家好:),<script>,敏感,被就業(yè),網(wǎng)絡(luò)授課沒(méi)感覺(jué),因?yàn)榭床灰?jiàn)大家伙兒";FilterChain fc=new FilterChain();fc.addFilter(new HTMLFilter()).addFilter(new SensitiveFilter());System.out.println(fc.doFilter(message));} }若該FilterChain也實(shí)現(xiàn)Filter接口,那么就可以自己添加自己的FilterChain了,很巧妙
由此可以拓展出,tomcat下可以加上request和response過(guò)濾器
代碼如下:
?
package top.littlepage.designPattern.responsibilityChain;public interface Filter {void doFilter(Request req,Response res,FilterChain fc); } package top.littlepage.designPattern.responsibilityChain;import java.util.ArrayList; import java.util.List;public class FilterChain implements Filter {List<Filter> filters = new ArrayList<>();int index = -1;public FilterChain addFilter(Filter f) {filters.add(f);return this;}public void doFilter(Request req, Response res, FilterChain fc) {if (index == filters.size()-1)return;index++;filters.get(index).doFilter(req, res, fc);}} package top.littlepage.designPattern.responsibilityChain;public class HTTPFilter implements Filter{@Overridepublic void doFilter(Request req, Response res,FilterChain fc) {req.setRequestStr(req.getRequestStr().replaceAll("<", "[").replaceAll(">", "]"));System.out.println("after reqHttp:"+req);fc.doFilter(req, res, fc);res.setResponseStr(res.getResponseStr().replaceAll("//", "pp"));System.out.println("after resHttp:"+res);}} package top.littlepage.designPattern.responsibilityChain;public class Request {private String requestStr;public Request() {requestStr="";}public Request(String requestStr) {this.requestStr = requestStr;}public String getRequestStr() {return requestStr;}public void setRequestStr(String requestStr) {this.requestStr = requestStr;}@Overridepublic String toString() {return "Request [requestStr=" + requestStr + "]";} } package top.littlepage.designPattern.responsibilityChain;public class Response {private String responseStr;public Response() {responseStr="";}public Response(String responseStr) {this.responseStr = responseStr;}public String getResponseStr() {return responseStr;}public void setResponseStr(String responseStr) {this.responseStr = responseStr;}@Overridepublic String toString() {return "Response [responseStr=" + responseStr + "]";}} package top.littlepage.designPattern.responsibilityChain;public class SensitiveFilter implements Filter{@Overridepublic void doFilter(Request req, Response res,FilterChain fc) {req.setRequestStr(req.getRequestStr().replaceAll("sensitive", "***"));System.out.println("after reqSen:"+req);fc.doFilter(req, res, fc);res.setResponseStr(res.getResponseStr().replaceAll("mingan", "notmingan"));System.out.println("after resSen:"+res);} } package top.littlepage.designPattern.responsibilityChain;public class Test {public static void main(String[] args) {String str="<script>//abbbmingansensitive";Request req=new Request(str);Response res=new Response(str);FilterChain fc=new FilterChain();fc.addFilter(new HTTPFilter());fc.addFilter(new SensitiveFilter());fc.doFilter(req, res, fc);} }控制臺(tái)打印如下
?
可以看出,首先接收端進(jìn)行接收request分別執(zhí)行Http進(jìn)行過(guò)濾req,執(zhí)行Sensitive進(jìn)行過(guò)濾req
到達(dá)服務(wù)端,開(kāi)始原路返回,先執(zhí)行Sensitive過(guò)濾器進(jìn)行過(guò)濾,然后執(zhí)行Http過(guò)濾器進(jìn)行過(guò)濾,
這一系列變成了一個(gè)鏈條,將各個(gè)過(guò)濾器穿在一起,也就成了所說(shuō)的責(zé)任鏈設(shè)計(jì)模式。
由于是一步一步進(jìn)行攔截,所以說(shuō),也可以稱(chēng)作攔截器模式
由此可見(jiàn):原理和tomcat的filter的大致原理一樣,先原線路進(jìn)行依次對(duì)請(qǐng)求值進(jìn)行過(guò)濾,然后
再對(duì)客戶(hù)端的返回值進(jìn)行過(guò)濾
?
轉(zhuǎn)載于:https://www.cnblogs.com/littlepage/p/9914497.html
總結(jié)
以上是生活随笔為你收集整理的设计模式(一)Chain Of Responsibility责任链模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 去哪儿旅行app分析(汉典去字的基本解释
- 下一篇: 人生app怎么没了