스트래티지 패턴은 간단히 말해서 "변하는 부분을 따로 떼어 분리시켜라" 이다.

지금 국내 방한시 예의없는 행동으로 인해 많은 욕을 먹고 있지만 개인적으로 좋아하는

영화인 트랜스포머를 예로 들겠다.

설명하면서 실제 트랜스포머들과 일치하지 않는 부분이 많이 있을 수 있다. ㅋㅋ

일단 나는 트랜스포머들에게

형태, 드라이브, 무기, 공중비행

이라는 것들을 부여하겠다.

여기서 변하지 않는 부분과 변하는 부분이란 무엇일까?

개념차이야 있겠지만 나는 여기서

형태와 드라이브 를 변하지 않는 부분,

무기와 공중비행 을 변하는 부분

으로 나누겠다.

<변하지 않는 부분>

모든 트랜스포머 로봇들은 어떠한 형태든지 무조건적으로 지니고 있으므로

변하지 않는 부분으로 정했고,

드라이브 능력도 모든 트랜스포머에게 가능하므로(물론 예외도 있지만)

변하지 않는 부분으로 정했다.

여기에서 형태와 드라이브의 다른점은

형태는 모두 지니고 있지만 정해진 형태가 아닌 모두 다른 형태를 띄므로 추상화 메서드로 만들어

모든 로봇들이 각자만의 형태를 이루도록 강제적으로 오버라이딩 하도록 했고,

드라이브는 다른 방식의 드라이브도 있을 수 있지만 일반적인 드라이브 개념을 가지고

있으므로 오버라이딩 여부에 자율화를 두도록 하였다. (오버라이딩 해도 되도 안해도 된다는 뜻)

<변하는 부분>

무기는 있을 수도 있고 없을 수도 있고 바꿔 낄수도 있으며 종류도 다양하므로 변하는 부분으로,

공중비행도 마찬가지로 비행하는 방법들이 변화무쌍하기 때문에

변하는 부분으로 정했다.

그래서 나는 무기와 공중비행이라는 것을 따로 떼어 놓겠다.

여기서 집고 넘어갈 디자인 패턴-
바뀌는 부분은 캡슐화 한다!
구현이 아닌 인터페이스에 맞춰서 프로그래밍한다!


먼저 무기라는 인터페이스를 하나 만들겠다.

(귀찮아서 모두 동일한 패키지를 사용하였다.)


그리고 장착할 무기들을 종류별로 몇개 만들어 보겠다.

망치

새총

짱돌


이렇게 디셉티콘을 혼내줄 무기들을 만들어 보았다.

하지만 트랜스포머를 보신 분들은 아시겠지만 오토봇들이 생각만큼 강하지가 못하다.

오토봇의 리더인 프라임도 초반에 아주 멋있게 등장했지만 나중에 메가트론한테 힘도 못쓰고

쥐어 터진다.

재즈는 죽기까지 하고...

그래서 나는 오토봇들에게 공중비행 기능을 줄 것이다.

싸우다 안되면 사정없이 도망갈 수 있도록.

공중비행도 무기와 마찬가지로 인터페이스를 선언해 준다.



그리고 날 수 있는 행동들을 만들어 준다.

축지법

순간이동!

그냥 나는거


이젠 오토봇들도 싸우다가 안되면 작전상 후퇴를 무사히 할 수 있다.

이젠 오토봇들을 불러보자.

먼저 오토봇에 대한 공통사항들을 담고 있는 추상클래스를 선언한다.

(actionscript 3.0 에는 추상클래스가 존재하지 않아서 자바와 같이 abstract 라는게 없다.
 따라서 actionscript 3.0에서도 추상클래스같이 사용할 수 있도록
 구현하였다. 이에 대한 내용은 지돌스타님의
ActionScript 3.0 추상클래스(abstract class) 만들기 에서 볼 수 있다.)

여기서 집고 넘어갈 디자인 패턴-
상속보다는 구성을 활용한다!

무기와 공중비행 능력을 상속받아 사용하지 않고 인터페이스로 만들어 구성을 활용하였다.



이젠 오토봇들을 만들자~

먼저 오토봇의 리더 옵티머스 프라임!
무시무시한 뿅망치와 축지법 능력을 부여하였다.

주인공의 친구 범블비~
범블비에겐 새총과 파닥파닥 날개짓을!

재즈!
안타깝게 메가트론에게 죽음을 당한 재즈에겐 특별히 순간이동 기능을...


이젠 필요한건 다 만들었다.

오토봇들을 만들었고,

오토봇들에게 필요한 무기와 공중비행 능력들을 만들어 각 오토봇들에게 알맞게

부여했다.

오토봇 추상클래스에서 setArms()와 setFly() 라는 함수를 만들어

원한다면 무기와 공중비행 능력을 바꿀 수 있도록 하였다.

이젠 한번 실행해보자!

나는 오토봇의 리더인 옵티머스 프라임을 수행시켜 보았다.



결과는 아래와 같다.

I am Optimus Prime.
뿅망치 장착!!
축지법
새총 장착!!
drive~~

음 아주 잘 나온다.


이렇게 스트래티지 패턴을 사용하면 어떤점이 좋을까?

재사용성이 가능 하다.

예제에도 나왔듯이 무기를 몇개 만들어 놓으면

어떤 오토봇에게든지 간단하게 무기를 장착할 수 있다.

무기가 없으면 안주면 되고 필요한 무기가 있으면 만들어져 있는 무기를

그냥 가져다가 쓰면 되는 것이다.

확장성이 용이 하다.

만약 따발총을 가지고 싶다면 따발총 클래스만 하나 만들면 된다.

그럼 만들어진 따발총 클래스를 원하는 로봇에게 부여하기만 하면되고

아니면 setAram와 같은 메서드를 통해 나중에 변경시켜줄 수도 있다.

관리성이 뛰어나다.

위에서 Wings 클래스를 사용하면 로봇들이 파닥파닥 날게 되는데

푸더덕푸더덕 날개짓으로 바꾸고 싶으면 Wings 클래스 하나만 변경하면

모든 로봇들은 푸더덕푸더덕 하고 날게된다.

여기까지 스트래티지 패턴 설명을 마치도록 하겠다.


참고자료 - Head First Design Patterns
Posted by 윤연식
,