-
스트래티지 패턴(Strategy pattern)java디자인패턴 2018. 11. 27. 18:08
스트래티지 패턴(Strategy pattern)에서는 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지를 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.
문제점
1. 기존 로봇의 공격과 이동 방법을 수정하는경우
->기존 코드를 수정해야하므로OCP에 위배된다 .
2. 새로운 로봇 추가시에도
-모든 코드를 수정해야한다
해결책
무엇이 변화 되었는 지 찾아야 한다 변화된것을 찾으 후에 이를 클래스로 캡슐화 해야한다 . 로봇 예제에서 변화되면서 문제를 발생시키는 요인은 로봇의 이동방식과 공격방식의 변화다 . 즉 새로운 이동 및 공격 기능이 계속해서 추가될수 있으므로 새로운 로봇이라 이러한 기능을 별다른 코드의 변경 없이 제공받거나 기존의 공격이나 이동방식을 다른 고격이다 이동방식으로 쉽게 변경 할 수있어야 한다.
keyPoint 무엇이 변화 되었는지 찾은 후에 이를 클래스로 캡슐화한다.
Robot 클래스 입장에서 보면 구체적인 이동방식과 공격방식이 MovingStrategy와 AttackStrategy 인터페이스에 의해 캡슐화 되어있다 . 따라서 이들 기능을 이용하는 로봇 객체와는 상관없이 향후 등장한 이동방식과 공격방식의 변화뿐만 아니라 현재 변화도 잘처리할 수 있게 된다 .
예를 들어 새로운 공격방식이 개발되어 현재 로봇에 제공하더라도 AttackStrategy 인터페이스가 변화에 대한 일종의 방화벽 역할을 수행해 Robot클래스의 변경을 차단해준다
즉 새로운 기능추가가 기존의 코드에 영향을 미치지 못하므로 OCP를 만족하는 설계가 된다 .
이렇게 변경된 새로운 구조에서는 외부에서 로봇객체의 이동방식과 공격방식을 임의 대로 바꾸도록 해주는 매서드가 필요하다. 이를 위해 Robot 클래스에 setMovingStrategy와 setAttackStrategy 메서드를 정의 해 로봇의 이동방식과 공격방식을 필요할때 바꿀수 있도록했다 .
이런변경이 가능한 이유는 상속대신에 집약 관계를 이용했기 때문이다.
3. 집약 관계(Aggregation)
: 한 클래스가 다른 클래스를 포함하는 관계. '전체'와 '부분'의 관계이며, '전체'에 해당하는 클래스를 빈 마름모 화살표로 가리켜서 표시한다. 부분에 해당하는 객체를 다른 객체와 공유할 수 있는 경우에 집약 관계로 나타낸다. 이때, 전체 객체가 메모리에서 사라진다 해도 부분 객체는 사라지지 않는다. 아래의 그림3을 보자.
그림3. 클래스간 집약 관계(Aggregation)
Car의 멤버 radio와 engine은 생성자에서 새로 생성되는게 아니라, 파라메터로 전달받은 객체를 참조한다. 따라서, 전체 객체(여기서는 Car)가 사라져도 부분 객체(여기서는 Engine, Radio)은 사라지지 않는다.
5.4 스트래티지 패턴은 전략을 쉽게 바꿀수 있도록 하는 디자인 패턴이다. 여기에서 전략이란 어떤 목적을 달성하기 위해 일을 수행한느 방식 비지니스의 규치 , 문제를 해결하는 아고리즘 등으로 이해할수 있다. 프로그램에서 전략을 실행 할때는 쉽게 전략을 바꿔야할 필요가 있는 경우가 많이 발생한다. 특히 게임 프로그래밍에서 게임 캐릭터가 자신이 처한 상황에 따라 공격이나 행동하는 방식을 바꾸고 싶을때는 스트래지 패턴은 유용한다 .
Keypoint 스트래티지 패턴은 같은 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화 되어있고 이들이 필요할때 교체 할수 있도록 함으로써 동일한 문제를 다른 알고리즘으로 해결할 수 있게 하는 디자인 패턴이다.
'java디자인패턴' 카테고리의 다른 글
템플릿 메소드 패턴(Template Method Pattern) (0) 2018.12.06 어댑터 패턴 (0) 2018.12.03 싱글턴 패턴 (0) 2018.12.01 참고 (0) 2018.11.29 UML star 사용법 (0) 2018.11.21