-
[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를 상속받아 추가하기 용이하고, 모듈별로 나눠져 있어 유지보수와 책임분산 행동 반복성을 나눠서 관리 할 수 있다.
반응형'프로그래밍 > Java' 카테고리의 다른 글
[JAVA]객체 지향 디자인 패턴 - Adapter Pattern(어댑터 패턴) (0) 2022.03.23 [JAVA]객체 지향 디자인 패턴 - State Pattern(상태 패턴) (0) 2022.03.22 [JAVA]객체 지향 디자인 패턴 - Singleton Pattern (0) 2022.03.22 [Java Interface] 인터페이스를 사용하는 이유 (0) 2022.03.20 [JAVA abstract]추상화 클래스 , 메서드 알아보기 (0) 2022.03.20