1. 程式人生 > >java設計模式--責任鏈(一)

java設計模式--責任鏈(一)

責任鏈也可以叫做過濾器或者攔截器,只是不同的叫法而已,都是對當前的資料在使用前做相應的處理。

階段一:

從簡單的例子入手。問題描述:有一個字串,需要對這個字串做一些處理,然後輸出。這裡我定義了一個處理器MsgDealer,用來對字串進行相應的處理,相應的程式碼如下:

Main:作為資料的入口

package chanOfResponsibility;

public class Main {
	public static void main(String[] args) {
		String msg = "java知識點好多,需要花好多時間精力去學。好像出去旅遊。";
		MsgDealer msgDealer = new MsgDealer();
		msg = msgDealer.dealMsg(msg);
		System.out.println(msg);
	}
}

MsgDealer:字串的處理類

package chanOfResponsibility;

public class MsgDealer {
	public String dealMsg(String msg){
		msg = msg.replaceAll("。", ";");
		return msg;
	}
}


上面這段程式碼很簡單,我只是用MsgDealer來將字串中的“。”改成了“;”。

現在如果我想要對這個字串做進一步的處理,那麼我就要修改MsgDealer的dealMsg方法,在裡面再新加處理的程式碼就行了。比如我還想將所有的“多”替換成“*”,那麼MsgDealer就變成如下:

package chanOfResponsibility;

public class MsgDealer {
	public String dealMsg(String msg){
		msg = msg.replaceAll("。", ";");
		
		msg = msg.replaceAll("多", "*");
		return msg;
	}
}

如果這樣的處理方式很複雜,而不是這麼簡單的一行程式碼,那麼我們應該想辦法將這段處理程式碼封裝起來。新建一個介面如下:

package chanOfResponsibility;

public interface Filter {
	public String doFilter(String msg);
}

實現類如下:

package chanOfResponsibility;

public class SymbolFilter implements Filter{

	@Override
	public String doFilter(String msg) {
		msg = msg.replaceAll("。", ";");
		return msg;
	}
	
}

package chanOfResponsibility;

public class CharacterFilter implements Filter{

	@Override
	public String doFilter(String msg) {
		msg = msg.replaceAll("多", "*");
		return msg;
	}

}

此時MsgDealer變成了:

package chanOfResponsibility;

public class MsgDealer {
	public String dealMsg(String msg){
		SymbolFilter symbolFilter = new SymbolFilter();
		msg = symbolFilter.doFilter(msg);
		
		CharacterFilter characterFilter = new CharacterFilter();
		msg = characterFilter.doFilter(msg);
		return msg;
	}
}


此時MsgDealer的程式碼有些冗餘,SymbolFilter與CharacterFilter都實現了Filter藉口,它們兩個組合起來就相當於一個過濾器鏈。先寫一個簡單的鏈,用陣列將這兩個過濾器放在一起,程式碼如下:

package chanOfResponsibility;

public class MsgDealer {
	
	public Filter[] f = new Filter[]{new SymbolFilter(),new CharacterFilter()};
	
	public String dealMsg(String msg){
		for(Filter filter : f){
			msg = filter.doFilter(msg);
		}
		return msg;
	}
}

這樣如果再新增一個filter,直接在f中再新增一個就行了,同時你還可以控制過濾器的先後次序。這其實就是個簡單的責任鏈。


未完待續。。。


以上是個人觀點,如有錯誤,歡迎指正。