전략패턴
전략 패턴(Strategy Pattern) 이란 전략을 쉽게 바꿀 수 있도록 해주는 디자인 패턴이다. 여기에서 전략이란 어떤 목적을 달성하기 위해 일을 수행하는 방식, 비즈니스 규칙, 문제를 해결하는 알고리즘 등으로 이해할 수 있다.[1]
개요
디자인패턴에서 전략패턴(strategy pattern)을 따르는 클래스는 유연하고 재사용 가능한 객체 지향 소프트웨어를 설계하기 위해 반복되는 디자인 문제를 해결하는 방법, 즉 객체는 구현, 변경, 테스트, 재사용이 쉬워야 한다는것을 기술하는 23가지 GoF 디자인 패턴중 하나이다.[2] 같은 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화되어 있고 이들이 필요할 때 교체할 수 있도록 함으로써 동일한 문제를 다른 알고리즘으로 해결할 수 있게하는 패턴이다.[1]
특징
목적
하나의 결과를 만드는 목적(메소드)는 동일하나, 그 목적을 달성할 수 있는 방법(전략, 알고리즘)이 여러가지 존재할 경우에 사용하는 패턴이다. Context의 변경을 최소화하고, 인터페이스를 통해 다양한 타입을 만들어 코드를 변경할 수 있다.[3]
장점
새로운 알고리즘이 개발되더라도 기존에 작성했던 클래스의 코드를 수정하지 않고도 이를 쉽게 추가 적용할 수 있게 한다. SOLID원칙에서 개방-폐쇄원칙(OCP)를 만족한다.[4]
구조 [1]
Strategy는 인터페이스나 추상클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시한다. ConcreteStrategy는 전략패턴(strategy pattern)에서 명시한 알고리즘을 실제로 구현한 클래스이다. Context는 전략패턴(strategy pattern)을 이용하는 역할을 수행한다. 필요에 따라 동적으로 구체적인 전략을 바꿀 수 있도록 setter 메소드를 제공한다.
활용 예제
로봇 만들기 [1]
이 클래스 다이어그램에서 Atom 클래스와 TaekwonV 클래스는 Robot이라는 추상 클래스의 자식 클래스로 설정했다. 이렇게 설계한 이유는 아톰과 태권V는 둘 다 attack과 move기능이 있는 로봇의 한 종류 이기 때문이다. 아톰과 태권V의 이동 기능과 공격기능이 서로 다르기 때문에 Robot 클래스에서 attack과 move메서드를 추상메서드로 설정해 자식 클래스에서 각각 정의하도록한다.
//Robot 클래스 public abstract class Robot { private String name; public Robot(String name) { this.name = name; } public String getName() { return name; } public abstract void attack(); public abstract void move(); }
//TaekwonV 클래스 public class TaekwonV extends Robot { public TaekwonV(String name) { super(name); } public void attack() { System.out.println("미사일 공격"); } public void move() { System.out.println("걷는다."); } }
//Atom 클래스 public class Atom extends Robot { public Atom(String name) { super(name); } public void attack() { System.out.println("강펀치 공격"); } public void move() { System.out.println("비행"); } }
//Client 클래스 public class Client { public static void main(String[] args) { Robot r1 = new TaekwonV("태권브이"); Robot r2 =new Atom("아톰"); //r1의 이동 공격 System.out.println("내 이름은 " + r1.getName()); r1.move(); r1.attack(); System.out.println(); //r2의 이동 공격 System.out.println("내 이름은 " + r2.getName()); r2.move(); r2.attack(); } }
<실행결과>
각주
- ↑ 1.0 1.1 1.2 1.3 정인상, 채흥석, <자바 객체지향 디자인 패턴: UML과 GoF 디자인 패턴 핵심 10가지로 배우는>, <<한빛 미디어>>, 2014-04-28
- ↑ 전략 패턴 위키백과 - https://ko.wikipedia.org/wiki/%EC%A0%84%EB%9E%B5_%ED%8C%A8%ED%84%B4
- ↑ 문메이, <전략패턴(Strategy Pattern)>, <<개인 블로그>>, 2018-04-03
- ↑ favxoe, <전략패턴>, <<개인 블로그>>, 2019-11-06
참고자료
- 정인상, 채흥석, <자바 객체지향 디자인 패턴: UML과 GoF 디자인 패턴 핵심 10가지로 배우는>, <<한빛 미디어>>, 2014-04-28
- 전략 패턴 위키백과 - https://ko.wikipedia.org/wiki/%EC%A0%84%EB%9E%B5_%ED%8C%A8%ED%84%B4
- 문메이, <전략패턴(Strategy Pattern)>, <<개인 블로그>>, 2018-04-03
- favxoe, <전략패턴>, <<개인 블로그>>, 2019-11-06