The Chain Of Responsibility (1)
사고의 방향
본 격 적 으로 책임 연 대 를 접 하기 전에 우리 가 상상 할 수 있 는 것 은 체인, 링크?한 가지 일 을 처리 하려 면 사슬 이 필요 한 것 같 습 니까?사실 답 은 많 지 않다. 바로 이렇다.디자인 모델 도 모두 소박 한 사고 에서 일련의 정 리 를 통 해 얻 은 것 이다.다음은 책임 체인 의 진화 의 길 을 이야기 하 겠 습 니 다.
근원
책임 체인 도 실제 개발 에서 끊임없이 승화 되 어 얻 은 '체계' 인 데 이것 도 '모델' 이 라 고 부 르 는 원인 이다.예 를 들 어, 우 리 는 지금 사용자 가 업로드 한 데 이 터 를 필터 해 야 한다.이런 기능 을 실현 하려 면 우리 가 먼저 생각 하 는 것 은 다음 과 같다.
//
String message = "<script>while(1){alert('HaHa, , ')</script>";
String result = message.replaceAll("<","[");
result = result.replaceAll(">","]");
System.out.println(" :" + message);
System.out.println(" :" + result);
간단 하 죠? 그런데 생각해 보 니 이 정도 면 충분 할 까요?
사실 String 류 의 디자인 은 하나의 체인 모델 이다. 이런 점 에서 우 리 는 replace All 방법 에서 실 마 리 를 볼 수 있다.
난이도 좀 높 여 주세요.
지금 만약 에 더욱 고 급 스 러 운 기능 을 추가 했다 면 그것 은 HTML 코드 에 대한 전의, 민감 한 단어의 여과, 대체 어의 교체 등 을 실현 하 는 것 이다.그러면 우리 가 이렇게 쓰 면 이 방법 체 는 크게 변 하고 유지 하기 가 쉽 지 않다.그리고 대상 을 대상 으로 하 는 사고 에 따라 우 리 는 하나의 인 터 페 이 스 를 추상 화하 고 어떤 기능 을 실현 하려 면 이 인 터 페 이 스 를 실현 하여 해당 하 는 업무 논 리 를 완성 하도록 하면 되 잖 아.
다음은 이런 실현 을 살 펴 보 자.우선 인터페이스: Filter. java
package ResponsibilityChain;
public interface Filter {
public String doFilte(String message);
}
HTMLFilter.java
package ResponsibilityChain;
/** * HTML filter utility. * * * * @author Craig R. McClanahan * @author Tim Tye */
public final class HTMLFilter implements Filter{
/** * Filter the specified message string for characters that are sensitive in * HTML. This avoids potential attacks caused by including JavaScript codes * in the request URL that is often reported in error messages. * * @param message * The message string to be filtered */
public String doFilte(String message) {
if (message == null)
return (null);
char content[] = new char[message.length()];
message.getChars(0, message.length(), content, 0);
StringBuilder result = new StringBuilder(content.length + 50);
for (int i = 0; i < content.length; i++) {
switch (content[i]) {
case '<':
result.append("<");
break;
case '>':
result.append(">");
break;
case '&':
result.append("&");
break;
case '"':
result.append(""");
break;
default:
result.append(content[i]);
}
}
return (result.toString());
}
}
SesitiveFilter.java
package ResponsibilityChain;
public final class SesitiveFilter implements Filter {
@Override
public String doFilte(String message) {
// , , , ,
String str = message.replaceAll(" ", " ");
return str;
}
}
ReplacableFilter.java
package ResponsibilityChain;
public class ReplacableFilter implements Filter {
@Override
public String doFilte(String message) {
// , , , ,
String str = message.replaceAll(" ", " ");
return str;
}
}
그 다음 에 업무 논리 적 인 관리자 입 니 다. 여과 할 데 이 터 를 받 고 처 리 된 데 이 터 를 되 돌려 줍 니 다. MyProcessor. 자바.
package ResponsibilityChain;
public class MyProcessor {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String process() {
//
HTMLFilter htmlFilter = new HTMLFilter();
String result = htmlFilter.doFilte(msg);
//
SesitiveFilter sesitiveFilter = new SesitiveFilter();
result = sesitiveFilter.doFilte(result);
ReplacableFilter replacableFilter = new ReplacableFilter();
result = replacableFilter.doFilte(result);
return result;
}
}
마지막 으로 테스트 해 보 자.Main.java
package ResponsibilityChain;
public class Main {
public static void main(String[] args) {
//
String message = "<script>while(1){alert('HaHa, , ')</script>";
MyProcessor myProcessor = new MyProcessor();
myProcessor.setMsg(message);
String result = myProcessor.process();
System.out.println(" :" + message);
System.out.println(" :" + result);
}
}
요약 하면 우리 가 필요 로 하 는 기능 을 실현 할 수 있 습 니 다. 우 리 는 MyProcessor 류 에 필 터 를 추가 하여 우리 가 필요 로 하 는 모든 기능 을 완성 할 수 있 습 니 다.하지만 보 세 요.
public String process() {
//
HTMLFilter htmlFilter = new HTMLFilter();
String result = htmlFilter.doFilte(msg);
//
SesitiveFilter sesitiveFilter = new SesitiveFilter();
result = sesitiveFilter.doFilte(result);
ReplacableFilter replacableFilter = new ReplacableFilter();
result = replacableFilter.doFilte(result);
return result;
}
이 코드 는 항상 좀 지루 하고 느낌 이 좀 무겁다.다음은 우리 가 이 문 제 를 해결 하 겠 습 니 다.
책임 체인 전신
위의 코드 가 너무 번 거 로 운 것 을 해결 하기 위해 책임 체인 의 전신 을 도입 하 였 습 니 다. 그것 은 하나의 배열 로 우리 의 모든 Filter 의 실현 류 를 저장 하여 우리 의 여과 임 무 를 관리 하 는 것 입 니 다.우 리 는 MyProcessor 류 에서 만 수정 하면 된다.MyProcessor 2. java
package ResponsibilityChain;
public class MyProcessor2 {
Filter[] filters = { new HTMLFilter(), new SesitiveFilter(), new ReplacableFilter() };
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String process() {
String result = msg;
for (Filter f : filters) {
result = f.doFilte(result);
}
return result;
}
}
테스트 해 보기:
package ResponsibilityChain;
public class Main2 {
public static void main(String[] args) {
//
String message = "<script>while(1){alert('HaHa, , ')</script>";
MyProcessor2 myProcessor2 = new MyProcessor2();
myProcessor2.setMsg(message);
String result = myProcessor2.process();
System.out.println(" :" + message);
System.out.println(" :" + result);
}
}
요약: 여기 서 우 리 는 배열 을 사용 하여 관리 하 는 장점 을 뚜렷하게 볼 수 있 습 니 다. 우 리 는 새로운 필 터 를 추가 하여 클래스 를 실현 할 때 이 배열 에 있 으 면 됩 니 다.이렇게 보니까 좀 재 미 있 겠 다.
책임 체인 출산
위의 코드 를 다 보 았 으 니 틀림없이 이 업무 논리 에 대해 잘 알 고 있 을 것 이다.그러나 이것 은 우리 의 책임 체인 모델 이 아니 라 '체인' 의 특징 을 나타 내지 못 했다. 그리고 만약 에 우리 가 두 개의 이런 배열 이 있다 면 합작 하여 여과 임 무 를 완성 해 야 하고 한 사람 이 반 을 완성 할 때 다른 배열 의 임 무 를 삽입 해 야 한다 면 비교적 까다 로 울 것 이다.그래서 다음은 책임 체인 에 맡 겨 관리 하 겠 습 니 다.FilterChain.java
package ResponsibilityChain;
import java.util.ArrayList;
import java.util.List;
public class FilterChain implements Filter{
private List<Filter> filters = new ArrayList<Filter>();
/** * return itself for better usage the Chain * * @param f * @return */
public FilterChain addFilter(Filter f) {
filters.add(f);
return this;
}
public void remove(Filter f) {
filters.remove(f);
}
/** * For the chain , it's also a chain for filter * * @param message * message need to be filtered * @return */
public String doFilte(String message) {
String result = message;
for (Filter f : filters) {
result = f.doFilte(result);
}
return result;
}
}
이렇게 되면 MyProcessor 도 MyProcessor 3. java 와 같은 수정 을 해 야 한다.
package ResponsibilityChain;
public class MyProcessor3 {
private FilterChain filterChain;
public FilterChain getFilterChain() {
return filterChain;
}
public void setFilterChain(FilterChain filterChain) {
this.filterChain = filterChain;
}
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
// and
public String process() {
String result = msg;
result = filterChain.doFilte(result);
return result;
}
}
다시 한 번 테스트 해 보 겠 습 니 다. Main 3. 자바.
package ResponsibilityChain;
public class Main3 {
public static void main(String[] args) {
//
String message = "<script>while(1){alert('HaHa, , ')</script>";
MyProcessor3 myProcessor3 = new MyProcessor3();
myProcessor3.setMsg(message);
FilterChain filterChain = new FilterChain();
// filterChain.addFilter(new HTMLFilter());
// filterChain.addFilter(new SesitiveFilter());
// filterChain.addFilter(new ReplacableFilter());
myProcessor3.setFilterChain(filterChain);
// ,
filterChain.addFilter(new HTMLFilter()).addFilter(new SesitiveFilter()).addFilter(new ReplacableFilter());
String result = filterChain.doFilte(message);
System.out.println(" :" + message);
System.out.println(" :" + result);
}
}
여기 서 잘 정리 해 야 합 니 다. 전형 적 인 사상 은 항상 사람 을 감탄 하 게 합 니 다.혹시 FilterChain. java 에서
public FilterChain addFilter(Filter f) {
filters.add(f);
return this;
}
이 방법 은 체인 의 효 과 를 완성 할 수 있다.자신 에 게 돌아 가면 똑 같은 방법 으로 체인 식 으로 임 무 를 완성 할 수 있다.그리고 FilterChain 에 도 doFilte 방법 이 있 습 니 다. 즉, 우 리 는 필 터 를 완성 하 는 기능 을 MyProcessor. java 류 에서 FilterChain 류 로 옮 겼 습 니 다.
또한 Filter 인터페이스의 FilterChain 을 실현 하면 더욱 자유로운 여과 규칙 을 추가 할 수 있 습 니 다.
이것 이 바로 대상 을 대상 으로 하 는 핵심 이다. 한 대상 이 어떤 기능 을 완성 할 수 있 는 지 는 그 자체 의 속성 에 달 려 있다.
이렇게 하면 우 리 는 MyProcessor 3. java 에서 책임 체인 의 이 필터 기능 만 호출 하면 된다.
총결산
본 고 는 현실 적 인 문제 에서 출발 하여 간단 하고 소박 한 사상, 대상 을 대상 으로 하 는 강화 와 전형 적 인 책임 체인 사상의 견인 을 거 쳤 다.간단 한 책임 체인 모델 의 작은 예 를 완성 했다.
세 심하게 음미 해 보면 느 낀 게 많 을 거 야.책임 체인 모델 은 실제 개발 과정 에서 도 흔히 볼 수 있다. 예 를 들 어 Struts 2 의 차단기 스 택 등 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.