실행 중에 알고리즘을 선택할 수 있게 하는 디자인 패턴이다.
전략 패턴은 특정한 계열의 알고리즘을 정의하고 각 알고리즘을 캡슐화하여 이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다.
즉, 전략패턴이란 특정 컨텍스트에서 알고리즘을 별도로 분리하는 설계 방법을 의미한다.
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" 출력
    }
}