2010년 1월 20일 수요일

디자인 패턴의 첫번째! 스트래티지 패턴(Strategy Pattern)

스트래티지 패턴이란?

  애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터

분리시켜서 캡슐화 하는 것

  - 나중에 바뀌지 않는 부분에는 영향을 미치지 않으면서 바뀌는 부분만 고치거나 확장가능

  - 바뀌는 부분을 뽑아내서 구현하는 클래스 집합은 유연성있게 디자인 하고 행동들을

    동적으로 바꿀 수 있도록 세터 메소드도 포함하는 것이 좋다.

 

구현이 아닌 인터페이스에 맞춰서 구현

 

  상위 형식에 맞춰서 프로그래밍 한다는 것을 뜻하는 것으로 꼭 자바의 인터페이스를
사용하라는 것이 아니라 인터페이스라는 개념을 지칭한다
. 실제 실행시에 쓰이는 객체가
코드에 의해서 고정되지 않도록 어떤 상위형식에 맞춰서 프로그래밍 함으로써 다형성을
활용
해야 한다는 것이다
. 상위형식에 맞춰서 프로그래밍 한다는 원칙은 변수를 선언할 때
보통 추상클래스나 인터페이스 같은 상위형식으로 선언해야한다
. 그렇게 할 경우 객체를
변수에 대입할 때 어떤 형식이든 집어넣을 수 있다
.

 

다형적인 형식을 사용하는 간단한 예

  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

댓글 없음:

댓글 쓰기