@Desc
: Strategy pattern은 Class의 어떤 행위를 캡슐화하여 Algorithm군으로 분리시키는 기법이다.
@Example
1) 오리 타입에 따라 울음 소리가 달라지는 것을 구현해 보고자 한다. 예를 들면, MallardDuck과 RedheadDuck은 똑같이 "꽥꽥"거리지만, RubberDuck은 "삑삑"대고, DecoyDuck은 "..." 아무 소리도 내지 못한다. 이것을 어떻게 구현해볼까?
2) 먼저 Overriding을 생각해 보자. Duck Class에서 가장 많이 사용될 것 같은 "꽥꽥"을 기본 Class에 구현하고, "삑삑"이나 "..."을 Overriding해야 할 것이다. 그런데.. 단점이 있다. 기본 클래스의 구현인 "꽥꽥"이 아니라면 코드가 중복되어야만 한다는 것이다. "삑삑" 소리를 내는 오리가 10 종류라면 10개를 중복해서 구현해야 하는 문제가 있다.
3) Interface를 사용하면 어떨까? 이건 제일 바보같은 아이디어다. 만약에 오리 타입이 50가지라면 50개를 전부 구현할 것인가? 공들여 전부 구현 코드를 넣었다고 치자. "꽥꽥"을 "꽤엑꽤엑"으로 바꾸려면 또 다시 50개를 수정해야 한다... 관리가 너무 힘들다.
4) 그렇다면 달라지는 부분은 어디인가? 이 부분을 찾아 달라지지 않는 부분으로부터 분리시켜 보자.
5) Duck Class의 Quack() 함수를 삭제하고 Quack() 행동을 QuackBehavior에게 위임하자.
6) QuackBehavior라는 Interface를 구현하는 Class들의 묶음을 우리는 Algorithm군으로 볼 수 있다.
7) MallardDuck과 RedheadDuck은 QuackBehavior중에서 Quack으로 행동하면 되고, RubberDuck은 Squeak으로, DecoyDuck은 MuteQuack으로 행동하면 된다.
8) 실행 중에 RubberDuck을 MuteQuack으로 변경할 필요가 생겼다면? 괜찮다. RubberDuck의 QuackBehavior만 Setter Method로 변경해주자. 간단히 행동을 바꿔줄 수 있다.
9) Strategy pattern을 이용해 중복과 변경 시 문제점을 해결할 수 있었다.
@Principle
" Composition " (상속보다는 구성)
: 구성을 이용하여 시스템을 만들면 유연성을 크게 향상시킬 수 있다.
: Strategy pattern은 Class의 어떤 행위를 캡슐화하여 Algorithm군으로 분리시키는 기법이다.
@Example
1) 오리 타입에 따라 울음 소리가 달라지는 것을 구현해 보고자 한다. 예를 들면, MallardDuck과 RedheadDuck은 똑같이 "꽥꽥"거리지만, RubberDuck은 "삑삑"대고, DecoyDuck은 "..." 아무 소리도 내지 못한다. 이것을 어떻게 구현해볼까?
2) 먼저 Overriding을 생각해 보자. Duck Class에서 가장 많이 사용될 것 같은 "꽥꽥"을 기본 Class에 구현하고, "삑삑"이나 "..."을 Overriding해야 할 것이다. 그런데.. 단점이 있다. 기본 클래스의 구현인 "꽥꽥"이 아니라면 코드가 중복되어야만 한다는 것이다. "삑삑" 소리를 내는 오리가 10 종류라면 10개를 중복해서 구현해야 하는 문제가 있다.
3) Interface를 사용하면 어떨까? 이건 제일 바보같은 아이디어다. 만약에 오리 타입이 50가지라면 50개를 전부 구현할 것인가? 공들여 전부 구현 코드를 넣었다고 치자. "꽥꽥"을 "꽤엑꽤엑"으로 바꾸려면 또 다시 50개를 수정해야 한다... 관리가 너무 힘들다.
4) 그렇다면 달라지는 부분은 어디인가? 이 부분을 찾아 달라지지 않는 부분으로부터 분리시켜 보자.
5) Duck Class의 Quack() 함수를 삭제하고 Quack() 행동을 QuackBehavior에게 위임하자.
6) QuackBehavior라는 Interface를 구현하는 Class들의 묶음을 우리는 Algorithm군으로 볼 수 있다.
7) MallardDuck과 RedheadDuck은 QuackBehavior중에서 Quack으로 행동하면 되고, RubberDuck은 Squeak으로, DecoyDuck은 MuteQuack으로 행동하면 된다.
8) 실행 중에 RubberDuck을 MuteQuack으로 변경할 필요가 생겼다면? 괜찮다. RubberDuck의 QuackBehavior만 Setter Method로 변경해주자. 간단히 행동을 바꿔줄 수 있다.
9) Strategy pattern을 이용해 중복과 변경 시 문제점을 해결할 수 있었다.
@Principle
" Composition " (상속보다는 구성)
: 구성을 이용하여 시스템을 만들면 유연성을 크게 향상시킬 수 있다.
No comments:
Post a Comment