책임 체인 방식 으로 단 어 를 고르다

제목 은 다음 과 같다.
        몇 개의 단 어 를 정 하고 다음 조건 에 맞 는 단 어 를 선택한다.
        1: ss 포함
        2: a 포함
        3: ks 로 끝난다.
        만약 당신 이 생각 하 는 것 이 for 순환 이 고, 그 다음 에 if (... & &... &) 라면 이 코드 들 을 어떻게 유지 하 는 지 는 말 할 필요 가 없습니다.
        만약 판정 조건 을 새로 추가 하면, 예 를 들 어 길이 가 7 보다 커 야 한다.
        아니면 제 생각 에는 조건 1 을 kk 포함 으로 바 꿔 주세요.
        그래서 다음 방법 을 도 입 했 습 니 다.  책임 체인 방식 으로 코드 를 처리 하 는 것 은 다음 과 같다.
package searchword;

public abstract class Filter {
	protected Filter successor;
	
	public void setFilter(Filter successor){
		this.successor=successor;
	}
	
	public abstract  void execu(String text);		
}
package searchword;

public class IsContain extends Filter {
	private String word;

	public IsContain(String word) {
		this.word = word;
	}
	/**
	 * @param text       
	 * 
	 */
	public void execu(String text) {
		if (text.indexOf(word) >= 0) {
			if (this.successor != null)
				this.successor.execu(text);
			else {
				System.out.println(text);
			}
		}
	}
}
package searchword;

public class IsEnd extends Filter{

	private String word;

	public IsEnd(String word){
		this.word=word;
	}
	
	/**
	 * @param text       
	 * 
	 */
	public void execu(String text) {
		if(text.endsWith(word))
			if(this.successor!=null)
				this.successor.execu(text);
			else {
				System.out.println(text);
			}
	}
}
package searchword;

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


public class Client {
	public static void main(String[] args) {
		List<String> wordsList=new ArrayList<String>();
		wordsList.add("asdfds");
		wordsList.add("ssakkendks");

		Filter isContainSS=new IsContain("ss");
		Filter isContainA =new IsContain("a");
		Filter endKs      =new IsEnd("ks");
		
		isContainSS.setFilter(isContainA);
		isContainA.setFilter(endKs);

		for (int i = 0; i < wordsList.size(); i++) {
			isContainSS.execu(wordsList.get(i));
			
		}
	}

}


테스트 결 과 는 다음 과 같다.
ssakkendks
책임 체인 의 장점 은 요청 발송 자 와 수신 자 를 결합 시 켜 여러 대상 이 요청 을 받 을 수 있 도록 하 는 것 이다. 이 대상 을 하나의 체인 으로 연결 하고 이 체인 을 따라 요청 을 전달 하 며 대상 이 처리 할 때 까지
우 리 는 큰 성 과 를 거 둔 것 같 지만 또 새로운 문제 가 생 겼 다. 위의 각 조건 간 의 관 계 는 내 가 조건 단 어 를 하나 더 넣 고 end 로 끝내 거나 ks 로 끝내 고 싶다 면 어 떨 까?코드 는 어떻게 바 꿉 니까?
생각 이 있어 요. 그게 바로...
package searchword;

import java.util.List;

public class OrIsEnd2 extends Filter {
	private List<String> words;

	public OrIsEnd2(List<String> words) {
		this.words = words;
	}

	@Override
	public void execu(String text) {
		for (int i = 0; i < words.size(); i++) 
			if (text.endsWith(words.get(i)))
				if (this.successor != null)
					this.successor.execu(text);
				else 
					System.out.println(text);

	}
}

테스트 결과
ssakkendks ssakkendbb
위의 방법 은 괜 찮 은 것 같 지만, 또 하나의 더 좋 은 방법 은 파이프 모델 을 이용 하여 이 문 제 를 처리 하 는 것 이다.
다음 에 우리 파이프 모드 에 대해 다시 이야기 합 시다.
참고 자료
파이프 필터 모드 (Pipe and Filter) 와 조합 모드

좋은 웹페이지 즐겨찾기