스트래티지 패턴이란?
애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터
분리시켜서 캡슐화 하는 것
- 나중에 바뀌지 않는 부분에는 영향을 미치지 않으면서 바뀌는 부분만 고치거나 확장가능
- 바뀌는 부분을 뽑아내서 구현하는 클래스 집합은 유연성있게 디자인 하고 행동들을
동적으로 바꿀 수 있도록 세터 메소드도 포함하는 것이 좋다.
구현이 아닌 인터페이스에 맞춰서 구현
상위 형식에 맞춰서 프로그래밍 한다는 것을 뜻하는 것으로 꼭 자바의 인터페이스를
사용하라는 것이 아니라 인터페이스라는 개념을 지칭한다. 실제 실행시에 쓰이는 객체가
코드에 의해서 고정되지 않도록 어떤 상위형식에 맞춰서 프로그래밍 함으로써 다형성을
활용 해야 한다는 것이다. 상위형식에 맞춰서 프로그래밍 한다는 원칙은 변수를 선언할 때
보통 추상클래스나 인터페이스 같은 상위형식으로 선언해야한다. 그렇게 할 경우 객체를
변수에 대입할 때 어떤 형식이든 집어넣을 수 있다.
다형적인 형식을 사용하는 간단한 예
Animal 이라는 추상클래스가 있고 그 밑에 Dog와 Cat이라는 구상클래스가 있다고 가정
구현에 맞춰서 프로그래밍 할 경우
Dog d = new Dog();
d.bark();
변수 “d"를 Dog형식(Animal을 확장한 구상클래스)으로 선언하면
어떤 구체적인 구현에 맞춰서 코딩해야 함
인터페이스/상위 형식에 맞춰서 프로그래밍 할 경우
Animal animal = new Dog();
animal.makeSound();
Dog라는 걸 알고 있긴 하지만 다형성을 활용하여 Animal에 대한 레퍼런스를 사용

상속보다는 구성을 활용
구성이란 "A에는 B가 있다" 라는 관계로 설명 할 수 있으며 상위 클래스에서 여러 개의
인터페이스 형식의 인스턴스변수를 추가하여 합치는 것을 구성(composition)을 이용하는 것이라고 한다. 구성은 단순히 알고리즘군을 별도의 클래스의 집합으로 캡슐화할 수 있도록 만들어주는 것 뿐 아니라 구성요소로 사용하는 객체에서 올바른 행동 인터페이스를 구현하기만 하면 실행시에 행동을 바꿀 수도 있게 해준다.
예를 들면
Duck 이라는 클래스와
FlyBehavior, QuackBehavior라는 인터페이스가 있고
FlyWithWings, FlyNoWay는 FlyBehavior를 인터페이스로 하는 클래스라고 할 때
Duck 클래스는
FlyBehavior flyBehavior
QuackBehavior quackBehavior
2개의 인터페이스 형식의 변수를 선언 함으로서
FlyBehavior과 QuackBehavior 인터페이스를 캡슐화와 구성으로 사용 하고 있다.
출처 : Head First Design Patterns
댓글 없음:
댓글 쓰기