ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA]객체 지향 디자인 패턴 - Strategy Pattern(전략 패턴)
    프로그래밍/Java 2022. 3. 22. 14:48
    반응형

    Strategy Patter(전략 패턴)이란?

    • 하나의 똑같은 행동이 있는데 전략마다의 구현부가 다르게 동작하고 싶을 때 사용하는 패턴이다.같은 기능이지만 서로 다른 전략을 가진 클래스들을 구현하는 것 옵션 들마다의 행동들을 모듈화해서 독립적이고 상호 교체 가능하게 만드는 것을 의미한다.

     

    Strategy Pattern Structure(전략 패턴 구조)

    • Context : 전략 패턴을 이용하는 역할을 수행한다. 필요에 따라 동적으로 구체적인 전략을 바꿀수 있도록 setter()메서 드를 제공한다.
    • Strategy : 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시한다.
    • ConcreteStrategy1, ConcreteStrategy2, ConcreteStrategy3 : 전략 패턴에서 명시한 알고리즘을 실제로 구현한 클래스이다.

     

     

    Strategy Pattern Example 1 (출처. 얄팍한 코딩사전)

    - 먼저 검색 기능이 있다고 가정해보며, 검색할 때 모두 검색, 이미지 검색, 지도검색, 뉴스 검색이 있을 수 있다. 이렇게 검색이라는 기능 안에 모두, 이미지, 지도, 뉴스 등 다른 검색 모듈이 필요 한 경우 동일한 기능(동일한 method)에 구체적인 기능 구현부가 다른 경우 strategy patter을 사용한다.

     

    Search기능 Interface 및 기능 구현 class

    - 구현부에서 모두 공통적인 기능 Search라는 기능을 인터페이스로 만든다

    - 그 인터페이스를 implements 상속받아 기능을 전략 마다 구현한다.

    public interface SearchStrategy {
    	public void search();
    }
    
    public class SearchStrategyAll implements SearchStrategy{
    	@Override
    	public void search() {System.out.println("Search All");}
    }
    public class SearchStrategyImage implements SearchStrategy{
    	@Override
    	public void search() {System.out.println("Search Image");}
    }
    public class SearchStrategyMap implements SearchStrategy{
    	@Override
    	public void search() {System.out.println("Search Map");}
    }
    public class SearchStrategyNews implements SearchStrategy{
    	@Override
    	public void search() {System.out.println("Search News");}
    }

    - 그 구현한 내용을 모듈별로 분류하여 사용할 수 있도록 strategy 호출부를 설정 한다.

    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();
    	}
    }

    - 호출부에서 다형성을 이용하여 searchStrategy를 모듈별로 바꿔가며 사용할 수 있도록 구현한다.

    - onClick이라는 이벤트(다른 메소드도 상관없음)안에 search라는 공통 메소드 호출부를 구현하여 다형성을 유지한다.

    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() {
    		searchButton.onClick();
    		setModeImage();
    		searchButton.onClick();
    		setModeNews();
    		searchButton.onClick();
    		setModeMap();
    		searchButton.onClick();
    	}
    }

    - 메인 프로그램에서 search라는 기능을 전략에 맞게 설정하여 전략패턴 구조에 맞게 설정 끝 

     

     

    Strategy Pattern Example 2

    - 선풍기가 있다고 가정하고 선풍기의 기능 중 선풍기를 트는 기능을 구현해보도록 하면, 그 안에 선풍기 강도를 조절하는것을 전략 패턴으로 구현해 보도록 하자.

    - 선풍기 기능 선풍기를 튼다라는 기능은 동일하지만 강도를 조절 하는 전략들은 다르게 구현되어야 할것이다.

     

    - TurnOn 인터페이스 및 클래스 구현

    public interface TurnOnStrategy {
    	public void turnOn();
    }
    
    public class TurnOnFairWind implements TurnOnStrategy{
    	@Override
    	public void turnOn() {System.out.println("순풍입니다.");}
    }
    
    public class TurnOnMediumWind implements TurnOnStrategy{
    	@Override
    	public void turnOn() {System.out.println("중풍입니다.");}
    }
    
    public class TurnOnStrongWind implements TurnOnStrategy{
    	@Override
    	public void turnOn() {System.out.println("강풍입니다.");}
    }

    - TurnOnButton (Strategy 실행부 구현)

    public class TurnOnButton {
    	private TurnOnStrategy turnOnStrategy = new TurnOnFairWind();
    	
        //다형성을 이용하여 전략별로 입력이 가능하도록 구현
    	public void setTurnOnStrategy(TurnOnStrategy turnOnStrategy) {
    		this.turnOnStrategy = turnOnStrategy;
    	}
    
    	//공통 메소드 호출부 구현
    	public void onClick() {
    		turnOnStrategy.turnOn();
    	}
    }

    - TurnOn 전략에 맞게 변경하고 호출하는 부분 구현

    public class TurnOnTest {
    	public static void main(String[] args) {
    		TurnOnButton turnOnButton = new TurnOnButton();
    		turnOnButton.onClick();
    		turnOnButton.setTurnOnStrategy(new TurnOnMediumWind());
    		turnOnButton.onClick();
    		turnOnButton.setTurnOnStrategy(new TurnOnStrongWind());
    		turnOnButton.onClick();
    	}
    }
    //출력
    //순풍입니다.
    //중풍입니다.
    //강풍입니다.

    Strategy Pattern을 사용하는 이유

    - Search라는 기능에서 다른 전략을 추가하는 경우 동영상이나, 사이트 같은 형태로 전략을 추가하는 경우 interface를 상속받아 추가하기 용이하고, 모듈별로 나눠져 있어 유지보수와 책임분산 행동 반복성을 나눠서 관리 할 수 있다.

    반응형

    댓글

Designed by Tistory.