Computer 그리고 Developer

[디자인패턴] 1. Strategy Pattern

버리야 2007. 1. 21. 13:29
반응형
1. Strategy Pattern

알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다.
알고리즘(전략,작전,책략)을 교체해서 동일한 문제를 다른 방법으로 해결하는 패턴
실행 중에 교체하는 것이 가능하다. – 다형성을 이용해서

"상속"을 이용해 프로그램을 할때의 단점

1) 서브클래스의 코드 중복
  부모클래스에서 메소드 fly()를 구현해 놓았다면(abstract일때) 서브 클래스에서는
  fly()를 쓰지 않아야 할때 매번 안쓴다는 코드를 구현해야 한다.
  (불필요한 행동을 그냥 아무것도 하지 않는것으로 오버라이드 해야한다.
  만약 규격이 자주 바뀌게 되면 매번 프로그램에 추가했던 부모클래스를 상속받은
  서브클래스의 메소드를 모두 일일이 살펴봐야한다.)

2) 실행시에 특징을 바꾸기 힘들다.

3) 모든 행동을 알기 힘들다.

4) 코드를 변경했을 때 다른 클래스에 원치 않은 영향을 끼칠수 있다.

덧 - “인터페이스”를 이용해 프로그램을 할때의 단점
자바 인터페이스에는 구현된 코드가 전혀 들어가지 않기 때문에 코드 재사용을 할 수 없다는 문제점이 있다. 즉 한 행동을 바꿀 때마다 그 행동이 정의되어 있는 서로 다른 서브클래스들을 전부 찾아서 코드를 일일이 고쳐야 하고, 그 과정에서 새로운 버그가 생길 가능성이 있다.

덧 - Interface와 Abstract Class
Interface는 구현된 Method가 없다. 모두 선언만 되어 있다.
Abstract Class는 일부분 구현된 Method가 있고 추상 Method는 하나 이상 있어야 하고 일반 Method도 있을수 있다.

디자인패턴 Point
소프트웨어를 만들 때, 나중에 혹시 고쳐야 할 때도 기존 코드에 미치는 영향은 최소한으로 줄이면서 작업을 할 수 있도록 만들수 있는 방법이 있다면 정말 행복하지 않을까?

디자인원칙
1. 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다.
달라지는 부분을 찾아서 나머지 코드에 영향을 주지 않도록 “캡슐화”한다.
그렇게 하면 나중에 바뀌지 않는 부분에는 영향을 미치지 않은채로 그 부분만 고치거나 확장할 수 있다.

2. 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.
상위(추상Class나 interface) 형식에 맞춰 프로그래밍한다.
실제 실행시에 쓰는 객체가 코드에 의해서 고정되지 않도록, 어떤 상위 형식(supertype)에 맞춰서 프로그래밍함으로써 다형성을 활용해야 한다.

Dog d = new Dog();
d.bark();

Animal animal = new Dog();            //Dog을 Cat으로 바꿀수 있다. – 다형성이용
Animal.makeSound();

더 바람직한 방법
new Dog() 같은 식으로 직접 코드를 만드는 대신 구체적으로 구현된 객체를 실행시에 대입하는 것.
A = getAnimal();
a.makeSound();

3. 상속보다는 구성을 활용한다.
구성 : “A는 B이다” 보다는 “A에는 B가 있다”가 나을수 있다.
“A에는 B가 있다” 관계에 대해 생각해 보면 각 오리에는 FlyBehavior와 QuackBehavior가 있으며, 각각 행동과 꽥꽥 거리는 행동을 위임 받는다
두 클래스를 이런식으로 합치는 것을 구성(composition)을 이용하는 것이라고 부른다.

한번 Think! 해보기
동적으로 행동을 지정하는 방법
상속과 interface를 통해 “동적”으로 코드를 쓰는 방법을 해결하는 방식 연구하기


- Head First Design Pattern을 공부하며

반응형