실행 중에 알고리즘을 선택할 수 있게 하는 디자인 패턴이다.
전략 패턴은 특정한 계열의 알고리즘을 정의하고 각 알고리즘을 캡슐화하여 이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다.
즉, 전략패턴이란 특정 컨텍스트에서 알고리즘을 별도로 분리하는 설계 방법을 의미한다.
package strategy.before;
public class MyProgram
{
private SearchButton searchButton = new SearchButton(this);
public Mode mode = Mode.ALL;
public void setModeAll () { mode = Mode.ALL;}
public void setModeImage () { mode = Mode.IAMGE;}
public void setModeNews () { mode = Mode.NEWS;}
public void setModeMap () { mode = Mode.MAP;}
}
package strategy.before;
public class SearchButton{
private MyProgram myProgram;
public SearchButton ( MyProgram _myProgram)
{
myProgram = _myProgram;
}
public void onClick()
{
if ( myProgram.mode == Mode.ALL)
{
System.out.println("SEARCH ALL"); //전체검색 코드
}
else if ( myProgram.mode == Mode.IMAGE)
{
System.out.println("SEARCH IMAGE") //이미지검색 코드
}
else if ( myProgram.mode == Mode.NEWS)
{
System.out.println("SEARCH NEWS") //뉴스검색 코드
}
else if ( myProgram.mode == Mode.MAP)
{
System.out.println("SEARCH MAP") //지도검색 코드
}
}// "onClick() end"
}
package strategy.after
public class Main{
public static void main(String[] args)
{
MyProgram myProgram = new MyProgram();
myProgram.testProgram();
}
}
package strategy.after
public class SearchButton
{
private MyProgram myProgram;
public SearchButton ( MyProgram _ myProgram)
{
myProgram = _myProgram;
}
private SearchStrategy searchStrategy = new SearchStrategyAll();
public void setSearchStrategy ( SearchStrategy _searchStrategy)
{
searchStrategy = _searchStrategy;
}
public void onClick()
{
searchStrategy.search();
}
}
package strategy.after;
interface SearchStrategy{
public void search();
}
class SearchStrategyAll implements SearchStrategy{
public void search()
{
System.out.println("SEARCH ALL");
//전체검색 코드
}
}
class SearchStrategyImage implements SearchStrategy{
public void search()
{
System.out.println("SEARCH IMAGE");
//이미지검색 코드
}
}
class SearchStrategyNews implements SearchStrategy{
public void search()
{
System.out.println("SEARCH NEWS");
//뉴스검색 코드
}
}
class SearchStrategyMap implements SearchStrategy{
public void search()
{
System.out.println("SEARCH MAP");
//지도검색 코드
}
}
package strategy.after;
public class MyProgram{
private SearchButton searchButton = new SearchButton(this);
public void setModeAll()
{
searchButton.setSearchStrategy(new SearchStrategyAll());
}
public void setModeImage()
{
searchButton.setSearchStrategy(new SearchStrategyImage());
}
public void setModeNews()
{
searchButton.setSearchStrategy(new SearchStrategyNews());
}
public void setModeMap()
{
searchButton.setSearchStrategy(new SearchStrategyMap());
}
public void testProgram()
{
searchBuuton.onClick(); //"SEARCH ALL" 출력
setModeImage(); //이미지 모드로 변환
searchBuuton.onClick(); //"SEARCH IMAGE" 출력
setModeNews(); //뉴스 모드로 변환
searchBuuton.onClick(); //"SEARCH NEWS" 출력
setModeMap(); //지도 모드로 변환
searchBuuton.onClick(); //"SEARCH MAP" 출력
}
}