請在后臺配置參數,參數名稱:topads
編程語言 php java

java設計模式-責任鏈模式(Chain of Responsibility Pattern)

java HTML我幫您 1年前  3182次瀏覽
責任鏈模式為了避免請求的發送者和接收者之間的耦合關系,使多個接受對象都有機會處理請求。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。通俗一點說就是,當客戶提交一個請求時,從第一個對象開始,鏈中收到請求的對象要么親自處理它,要么轉發給鏈中的下一個候選者。提交請求的對象并不知道哪一個對象將會處理它。當然職責鏈中也可能沒有可以處理該請求的對象,這種情況是允許發生的。
責任鏈模式(Chain of Responsibility)是Web項目中最經常用到的一個設計模式,比如是Apache Tomcat 的對Encoding的 處理,Struts2 的攔截器, jsp servlet 的Filter 等等,都是基于責任鏈模式設計的。比如有一個作業任務,先有一個對象對其負責處理,之后又交給其他的一個對象處理,一次傳遞下去,這是最通俗最簡單的責任鏈模式的應用。
package com.html580.chain;

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

/**
* 處理過濾信息的過濾接口類
*/
interface Filter {
public String doFilter(String msg);
}

/**
*
* 負責專門過濾HTML代碼的過濾器 實現了Filter 接口
*/
class HtmlFilter implements Filter {
@Override
public String doFilter(String msg) {
String result = msg.replace("<", "<").replace(">", ">");
return result;
}
}

/**
*
* 負責了處理敏感詞匯的過濾器 實現了Filter 接口
*/
class SesitiveFilter implements Filter {

@Override
public String doFilter(String msg) {
return msg.replaceAll("敏感", "普通詞匯");
}

}

/**
*
* 負責了處理敏感詞匯的過濾器 實現了Filter 接口 實現Filter 接口的主要原因是:將自身也設計成一個Filter,容易構建一個chain。
*/
abstract class AbsractFilterChian implements Filter {
public List filters = new ArrayList();

public abstract String doFilter(String msg);

public abstract AbsractFilterChian addAbsractFilterChian(Filter filter);
}

class FilterChian extends AbsractFilterChian{
/**
* 要實現在一個鏈條中加入另一個鏈條,的一個好辦法就是使用者一個鏈條也去實現那個對象的接口
*
* 前面使用的接口編程讓 AbsractFilterChian extends Filter 這個個接口,系統會報錯。是堆棧溢出問題
* 也沒有細究是什么原因,會報這個異常,就直接更改成為了抽象類,使用 implements 去實現 filter 并且實現
* doFilter 方法,省得有那么多的麻煩。
*/
@Override
public AbsractFilterChian addAbsractFilterChian(Filter filter) {
filters.add(filter);
return this;
}

@Override
public String doFilter(String msg) {
for (Filter filter : filters) {
msg = filter.doFilter(msg);
}
return msg;
}

}

/**
*
* 提供處理的對外統一接口
*/
class MsgProcessor {
/**
* 多個過濾器組合到一起之后就會形成過濾器鏈。
* 好處是過濾規則的排序,
* 先后順序的的原因,新舊規則可以靈活的替換更新
* 責任鏈模式
*/
private AbsractFilterChian chian;

public AbsractFilterChian getChian() {
return chian;
}

public void setChian(AbsractFilterChian chian) {
this.chian = chian;
}
private String msg;
public String getMsg() {
return msg;
}

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

public String process() {
return chian.doFilter(msg);
}
}
public class Client {
public static void main(String<> args) {

String msg = " 敏感信息";
AbsractFilterChian chian = new FilterChian();
chian.addAbsractFilterChian(new HtmlFilter());

AbsractFilterChian chian2 = new FilterChian();
chian2.addAbsractFilterChian(new SesitiveFilter());

chian.addAbsractFilterChian(chian2);

MsgProcessor processor = new MsgProcessor();

processor.setChian(chian);
processor.setMsg(msg);

System.out.println("轉換前HTML結果:" + msg);
System.out.println("HTML結果:" + processor.process());
}
}
輸出結果
轉換前HTML結果: 敏感信息
HTML結果: 普通詞匯信息



發表評論

2017怎样手机上赚钱 特斯拉汽车股票代码 股票今日大盘点数 30选5的开奖结果走势图 江西多乐彩开奖 北京11选5 走势图 赛车动漫 黑龙江体彩11选5官网 内蒙古11选五前三直 山西11选5走势图彩经网 新疆新乐彩11选5玩法