전략패턴 편집하기
편집을 되돌릴 수 있습니다.
이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 저장해주세요.
최신판 | 당신의 편집 | ||
1번째 줄: | 1번째 줄: | ||
− | ''' | + | '''전략 패턴'''(Strategy Pattern) 이란 전략을 쉽게 바꿀 수 있도록 해주는 디자인 패턴이다. 여기에서 전략이란 어떤 목적을 달성하기 위해 일을 수행하는 방식, 비즈니스 규칙, 문제를 해결하는 알고리즘 등으로 이해할 수 있다.<ref name = 'strategy01'> 정인상, 채흥석, <[https://www.hanbit.co.kr/store/books/look.php?p_code=B3400922670 자바 객체지향 디자인 패턴: UML과 GoF 디자인 패턴 핵심 10가지로 배우는]>, <<한빛 미디어>>, 2014-04-28</ref> |
== 개요 == | == 개요 == | ||
− | + | 디자인패턴에서 전략패턴(strategy pattern)을 따르는 클래스는 유연하고 재사용 가능한 객체 지향 소프트웨어를 설계하기 위해 반복되는 디자인 문제를 해결하는 방법, 즉 객체는 구현, 변경, 테스트, 재사용이 쉬워야 한다는것을 기술하는 23가지 GoF 디자인 패턴중 하나이다.<ref name = 'strategy02'>전략 패턴 위키백과 - https://ko.wikipedia.org/wiki/%EC%A0%84%EB%9E%B5_%ED%8C%A8%ED%84%B4</ref> 같은 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화되어 있고 이들이 필요할 때 교체할 수 있도록 함으로써 동일한 문제를 다른 알고리즘으로 해결할 수 있게하는 패턴이다.<ref name = 'strategy01'></ref> | |
== 특징 == | == 특징 == | ||
12번째 줄: | 12번째 줄: | ||
== 구조 <ref name = 'strategy01'></ref>== | == 구조 <ref name = 'strategy01'></ref>== | ||
− | [[파일:전략패턴컬레보레이션.PNG|800픽셀|섬네일|가운데| | + | [[파일:전략패턴컬레보레이션.PNG|800픽셀|섬네일|가운데|전략 패턴 컬레보레이션]] |
Strategy는 인터페이스나 추상클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시한다. ConcreteStrategy는 전략패턴(strategy pattern)에서 명시한 알고리즘을 실제로 구현한 클래스이다. Context는 전략패턴(strategy pattern)을 이용하는 역할을 수행한다. 필요에 따라 동적으로 구체적인 전략을 바꿀 수 있도록 setter 메소드를 제공한다. | Strategy는 인터페이스나 추상클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시한다. ConcreteStrategy는 전략패턴(strategy pattern)에서 명시한 알고리즘을 실제로 구현한 클래스이다. Context는 전략패턴(strategy pattern)을 이용하는 역할을 수행한다. 필요에 따라 동적으로 구체적인 전략을 바꿀 수 있도록 setter 메소드를 제공한다. | ||
== 활용 예제 == | == 활용 예제 == | ||
=== 로봇 만들기 <ref name = 'strategy01'></ref>=== | === 로봇 만들기 <ref name = 'strategy01'></ref>=== | ||
− | 이 클래스 다이어그램에서 Atom 클래스와 TaekwonV 클래스는 Robot이라는 추상 클래스의 자식 클래스로 설정했다. 이렇게 설계한 이유는 아톰과 태권V는 둘 다 attack과 move기능이 있는 로봇의 한 종류 이기 때문이다. 아톰과 태권V의 이동 기능과 공격기능이 서로 다르기 때문에 Robot 클래스에서 attack과 move메서드를 추상메서드로 설정해 자식 클래스에서 각각 정의하도록한다. | + | [[파일:전략기존코드예제모델.PNG|500픽셀|섬네일|가운데|전략 패턴 컬레보레이션]] |
+ | 이 클래스 다이어그램에서 Atom 클래스와 TaekwonV 클래스는 Robot이라는 추상 클래스의 자식 클래스로 설정했다. 이렇게 설계한 이유는 아톰과 태권V는 둘 다 attack과 move기능이 있는 로봇의 한 종류 이기 때문이다. 아톰과 태권V의 이동 기능과 공격기능이 서로 다르기 때문에 Robot 클래스에서 attack과 move메서드를 추상메서드로 설정해 자식 클래스에서 각각 정의하도록한다. | ||
− | |||
− | |||
− | |||
//Robot 클래스 | //Robot 클래스 | ||
public abstract class Robot | public abstract class Robot | ||
98번째 줄: | 96번째 줄: | ||
내 이름은 아톰 | 내 이름은 아톰 | ||
비행 | 비행 | ||
− | 강펀치 공격 | + | 강펀치 공격 |
+ | |||
+ | ==== 문제점 ==== | ||
+ | 기존 로봇의 공격 또는 이동 방법을 수정하려면 기존에 작성했던 Atom 클래스나 TaekwonV 클래스의 직접적으로 메소드의 코드 수정이 필요하다. 또 만약 새로운 로봇을 만들어 기존의 공격 또는 이동 방법을 추가하거나 수정하려면 분명 기존에 있던 방법임에도 불구하고 어떤 기술도 참조할 수 없고 새로운 로봇에 똑같은 내용을 또 추가해줘야 하는 상황이 발생한다. 클래스의 직접적인 코드 수정은 로봇의 종류가 많아질수록 중복 코드를 일관성 있게 유지 관리하는 일은 매우 힘들고 대단한 집중력을 요구하고 또 새로운 로봇을 추가 했을 때 매번 기존 코드를 입력하면서 발생하는 중복코드는 나중에 심각한 문제를 일으킬 수 있다. 그리고 매번 새로운 방식이 개발될수록 새로운 방식을 로봇에게 제공하려면 현재 시스템에서 관련된 기존의 모든 코드를 수정해야한다. <ref name = 'strategy01></ref> | ||
==== 해결책 ==== | ==== 해결책 ==== | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
{{각주}} | {{각주}} | ||
== 참고자료 == | == 참고자료 == | ||
* 정인상, 채흥석, <[https://www.hanbit.co.kr/store/books/look.php?p_code=B3400922670 자바 객체지향 디자인 패턴: UML과 GoF 디자인 패턴 핵심 10가지로 배우는]>, <<한빛 미디어>>, 2014-04-28 | * 정인상, 채흥석, <[https://www.hanbit.co.kr/store/books/look.php?p_code=B3400922670 자바 객체지향 디자인 패턴: UML과 GoF 디자인 패턴 핵심 10가지로 배우는]>, <<한빛 미디어>>, 2014-04-28 | ||
− | * | + | * 전략 패턴 위키백과 - https://ko.wikipedia.org/wiki/%EC%A0%84%EB%9E%B5_%ED%8C%A8%ED%84%B4 |
* 문메이, <[https://meylady.tistory.com/53 전략패턴(Strategy Pattern)]>, <<개인 블로그>>, 2018-04-03 | * 문메이, <[https://meylady.tistory.com/53 전략패턴(Strategy Pattern)]>, <<개인 블로그>>, 2018-04-03 | ||
* favxoe, <[https://fabxoe.tistory.com/62 전략패턴]>, <<개인 블로그>>, 2019-11-06 | * favxoe, <[https://fabxoe.tistory.com/62 전략패턴]>, <<개인 블로그>>, 2019-11-06 | ||
252번째 줄: | 115번째 줄: | ||
* [[모델-뷰-컨트롤러 패턴]] | * [[모델-뷰-컨트롤러 패턴]] | ||
* [[템플릿 메소드 패턴]] | * [[템플릿 메소드 패턴]] | ||
− | |||
− |