디자인 패턴 - Strategy(전략패턴)

jodbsgh·2022년 6월 12일
0

🎨"디자인 패턴"

목록 보기
2/4

😀전략패턴이란

실행 중에 알고리즘을 선택할 수 있게 하는 디자인 패턴이다.
전략 패턴은 특정한 계열의 알고리즘을 정의하고 각 알고리즘을 캡슐화하여 이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다.

즉, 전략패턴이란 특정 컨텍스트에서 알고리즘을 별도로 분리하는 설계 방법을 의미한다.

🧐전략패턴을 사용하는 이유

1. 전략 사용자(context)의 코드 변경 없이 새로운 전략을 추가할 수 있다.

  • 이를 통해 if-else 분기를 제거할 수 있다.
  • if-else 분기를 제거하면, 단일 책임 원칙을 준수하기 더 수월해진다.

2. 확장에 유리한 코드를 작성할 수 있다.

  • 새롭게 필요한 전략 콘크리트 클래스를 쉽게 만들 수 있다.
  • 개방 폐쇄 원칙을 준수한 코드 작성이 가능하다.

3. 런터임에 전략을 변경시킬 수 있다.

🤔전략패턴의 문제점

1. 어플리케이션에 들어가는 모든 전략을 알고 있어야 한다.

  • 클래스로 분리한 각 전략들이 어느 상황에 사용되어야 할 지 알고 있어야 한다.
  • 이 같은 특성이 어쩌면 유지보수를 더 힘들게 할 수 있다.

2. 전략을 추상화한 인터페이스가 효율적이지 못할 수 있다.

  • 어떤 전략 콘크리트 객체에서는 사용하지 않는 메서드들 역시 전략 인터페이스에 정의해 주어야 한다.

🎨Strategy Pattern 구현

Before

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"
}

After

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" 출력
    }
}
profile
어제 보다는 내일을, 내일 보다는 오늘을 🚀

0개의 댓글