티스토리 툴바


분류없음2009/05/20 23:26

티스토리는 여기까지만 운영하고 워드프레스로 옮겨가려구요~
뭐 어차피 들어오시는 분들은 적었지만-_-;
아무튼 주소는요!
http://asnike.com

많이 들려주세요~

Posted by 니케"
전략패턴에 들어가기 앞서..
사실 전부터 할려고 했으나 의지 부족으로 지금에서야 정리를 시작합니다 ^^;
그럼 잡설은 그만 하고 본론으로~



헤드 퍼스트 디자인 패턴 책을 이해한 후 정리를 하기때문에 순서도 헤드 퍼스트의 순서를 따르는걸 기본으로 하겠습니다.
그럼 맨 처음에 나오는 Strategy Pattern부터 알아 보겠습니다.

Strategy Pattern 은 무엇인가?! 에 대한 답은 여러 책을 참고해 보겠습니다. ↓

스트래티지 패턴( Strategy Pattern )에서는 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지를 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.
- 헤드 퍼스트 디자인 패턴 중

동일 계열의 알고리즘군을 정의하고, 각 알고리즘을 캡슐화하며, 이들을 상호교환이 가능하도록 만듭니다. 알고리즘을 사용하는 클라이언트와 상관없이 독립적으로 알고리즘을 다양하게 변경할 수 있게 합니다.
- GoF의 디자인 패턴 중

스트래티지 패턴은 유사한 알고리즘들의 집합을 정의하고, 그 각각을 클래스로 캡슐화하여 서로 교환이 가능하도록 해준다. 알고리즘을 사용하는 클라이언트 코드는 실제 실행되는 알고리즘과 독립적으로 동작한다.
- 자바 디자인 패턴과 리팩토리 중

위 3가지의 책들의 정의에서 공통적으로 들어간 부분이 있습니다. 바로 알고리즘군을 정의하고 각각 알고리즘간에 교환해서 사용할 수 있고 클라이언트와 독립적으로 알고리즘이 동작한다는 것이죠.

책에 나온 경우를 예로 들자면 오리가 등장합니다. 그런데 이 오리에 종류는 여러가지 입니다. 만약 상속을 통해 이 오리를 슈퍼클래스로하여 서브클래스로 오리의 종류를 구현하게 된다면 편리하겠죠? 하지만 예외의 경우는 항상 존재 합니다. 책에서 처럼요. 고무오리가 추가 되면서 날지 말아야할 고무오리가 슈퍼클래스 오리를 상속받아 날아다니게 되어버리죠. 물론 메서드를 오버라이드해서 날지 못하게 구현하면 되지만 더 많은 날지 않는 서브클래스 오리들을 구현 하려면 여간 귀찮은 일이 아닙니다. 이럴 때 스트래티지 패턴을 사용하면 해결되는거죠~

스트래티지 패턴의 정의대로 유사한 알고리즘들의 집합을 정의해보겠습니다. 나는 형태들을 유사한 알고리즘의 집합으로 볼 수 있겠죠 그래서

이렇게 나는 행위를 IFlyBehavior 인터페이스로 정의를 하고 실질적인 나는 행동을 하는 메서드를 fly()로 정의 하였습니다.  다음으로 이런 알고리즘군으로 부터 실질적 행동을 하는 클래스를 만들어 보겠습니다.

날 수 있는 알고리즘


날 수 없는 알고리즘


다음은 이 알고리즘 군을 사용하는 Duck 클래스입니다. Duck 클래스는 슈퍼클래스로 추상클래스여야 하지만 AS3에서 Abstract키워드를 제공하지 않으므로 구상클래스로 구현하겠습니다.

여기서 중요한 인스턴스 변수가 등장합니다. 바로 protected var flyBehavior: IFlyBehavior 입니다. 이 변수에 특정 행동에 대한 레퍼런스, FlyWithWings 또는 FlyNoWay의 레퍼런스 등이저장 되는것이지요.

마지막으로 이 Duck 클래스를 상속받아 MallardDuck 클래스와 RubberDuck 클래스를 만들어 보겠습니다.
MallardDuck 클래스


RubberDuck 클래스

이렇게 스트래티지 패턴을 통해 구현 해봤습니다. 사실 책에서는 우는 행위에 대해 알고리즘군을 정의한 QuackBehavior 인터페이스가 있지만 우는 행위까지 담으면 너무 내용이 길어져 나는 행위까지만 구현했습니다. 나는 행위, 우는 행위를 알고리즘군으로 빼 놓았기 때문에 우리는 새로운 오리가 나타나도 유연하게 대처할 수 있습니다. 알고리즘 클래스만 추가해서 각 행위를 담당하는 속성에 할당만 해주면 알아서 작동을 하기때문이죠.

그런데 우리는 이 패턴에서 몇가지 중요한 디자인 원칙을 발견할 수 있습니다. Duck 클래스를 보게 되면 변하지 않는 부분과 변하게 되는 부분이 자연스럽게 나누어져 있는것을 발견할 수 있습니다. 바로 이 원칙을 지킨거죠.

디자인 원칙 하나.
애플리케이션에서 달라지는 부분을 찾아 내고, 달라지지 않는 부분으로부터 분리 시킨다.

또 다른 디자인 원칙들을 발견할 수 있습니다. Duck 클래스에서 나는 행동을 바로 구현하지 않고 나는 행동 이라는 IFlyBehavior 인터페이스를 통해 집합을 만들고 특정행동은 행동 클래스 FlyWithWings, FlyNoWay 에서 구현했습니다. 이것은

디자인 원칙 둘.
구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.

바로 이 디자인 원칙을 지킨것이죠.

마지막으로 Duck 클래스의 서브 클래스들이 나는 행동을 상속을 통해 구현된것이 아닌 행동 객체 ( Duck 클래스의 flyBehavior 인스턴스 변수 ) 를 통해 구현되었습니다. 이것 또한 디자인 원칙입니다.

디자인 원칙 셋.
상속보다는 구성을 활용한다.

여기까지 숨겨진 디자인 원칙을 찾아 보았구요. 끝으로 스트래티지 패턴에서 알고리즘을 동적으로 변경할 수 있다고 했습니다.
위의 코드에 이 부분이 빠졌네요. 수정해 보면

Duck 클래스


이렇게 되겠습니다. setFlyBehavior 메서드를 통해 언제든지 나는 행위를 바꿔줄 수 있겠죠?
그럼 이제 Strategy Pattern의 정리를 마치겠습니다 ^^; 아 그리고 전체 예제 코드는 추후에 올리겠습니다. ㅎㅎ;
Posted by 니케"
ActionScript/MyProject2009/05/05 22:46



네비게이션 추가~
여기서 각각의 네비게이션이나 화살표 버튼은 다른데서도 쓸수 있다. 독립적으로 만들어져있기 때문에 확장이 쉽다~
오래만에 만졌더니 더 오래 걸려버렸다;
이제 다시 달려보자!!! +_+
Posted by 니케"