상황

- 위 상황에서 Duck에게 나는 행동과 꽥꽥거리는 행동을 추가하고 싶다.
- 상속을 이용. Duck 클래스에 fly(), quack() 메서드 추가
- 행동을 동적으로 변경할 수 없음(컴파일하면서 완전히 결정되어버림. 정적임)
- 변경하기 위해서는 오버라이드를 또 해주어야 함
- FlyingDuck, QuackDuck 인터페이스를 만들어서, 각각의 구현체들이 해당 인터페이스를 구현하도록 만듦
- 모든 구현체에 구현 메서드를 작성해주어야 함 ⇒ 코드 중복
- 해결책 ⇒ Duck 클래스에서 바뀌는 부분을 뽑아내어, 나는 행동과 꽥꽥거리는 행동에 대한 클래스 집합(FlyingBehavior, QuackBehavior 인터페이스와 구현체들)을 만든다. ⇒ 전략패턴
- 나는 행동, 꽥꽥거리는 행동 등 앞으로도 계속적으로 행동의 종류가 추가될 수 있고, 하나의 행동 안에서도 다양한 행동의 구현이 있을 수 있음
- 그 후 Duck 에서 해당 행동들을 Composition으로 가질 수 있도록

전략 패턴
알고리즘 군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있게 해준다.
전략 패턴을 사용하면 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있게 됨
패턴과 전문 용어
- 패턴으로 소통하면 일상어로 구구절절 말할 때보다 훨씬 효율적인 의사소통을 할 수 있음
- 서로 알고 있는 패턴은 정말 막강함
- 패턴을 사용하면 간단한 단어로 많은 얘기를 할 수 있음
- 패턴 수준에서 이야기하면 ‘디자인’에 더 오랫동안 집중할 수 있음
- 전문 용어를 사용하면 개발팀의 능력을 극대화 할 수 있음
- 전문 용어는 신입 개발자에게 훌륭한 자극제가 됨
디자인 패턴에 대한 오해
- 결국은 모든 게 그냥 좋은 객체지향 디자인에 불과한 것 아닌가? 캡슐화, 추상화, 상속, 다형성을 잘 알고 있기만 하면 디자인 패턴은 별로 신경쓰지 않아도 되는것 아닐까?
- 그러나 이러한 장점을 갖추고 있는 객체지향 시스템을 구축하는 일은 그리 간단하지 않음. 상당한 노력을 기울여야만 가능한 일
- 간단하지만은 않은 객체지향 시스템 구축 방법들을 모아서 디자인 패턴을 만든 것