'패턴'에 해당되는 글 2건

  1. 2007.09.05 [디자인 패턴#9] 템플릿 메소드 패턴
  2. 2007.04.20 [디자인 패턴#1] 스트레티지 패턴

[디자인 패턴#9] 템플릿 메소드 패턴

|



Template Method Pattern - 디자인 패턴

참고서적 : Head First Design Pattern
소스코드 다운로드 : http://www.wickedlysmart.com/headfirstdesignpatterns/code.html
 
패턴 정의 #9 - 템플릿 메소드 (Template Method) Pattern
템플릿 메소드 패턴에서는 메소드에서 알고리즘의 골격을 정의합니다.
알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있습니다.
템플릿 메소드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브클래스에서 특정 단계를 재정의 할 수 있습니다.
 
알고리즘의 템플릿 즉, 틀을 만들기 위한 패턴입니다.
추상클래스를 만들어 두고, 여기에 templateMethod를 둡니다.
templateMethod에서는 알고리즘에 따라 여러 메소드를 호출하고..
각각의 메소드는 추상클래스에 구현되어 있기도 하고 서브클래스에서 직접 구현해야 하는 것도 있습니다.
 
클래스 다이어그램을 통해서 살펴보도록 하지요~



- AbstractClass에 템플릿 메소드가 들어있습니다.
abstract 메소드로 선언된 단계(메소드)들이 템플릿 메소드에서 활용됩니다.
- ConcreteClass는 여러개가 있을 수 있습니다.
각 클래스에서는 템플릿 메소드에서 요구하는 모든 단계들을 제공해야 합니다.
- 템플릿 메소드에서는 알고리즘을 구현할 때, primitiveOperation1과 primitiveOperation2를 활용합니다.
알고리즘 자체는 이 단계들의 구체적인 구현으로부터 분리되어 있습니다.
- abstract로 선언되었던 단계들은 ConcreteClass에서 구현합니다.
templateMethod()에서는 이런 메소드를 호출해서 작업을 처리합니다.
 
추가적으로 concreteOperation은 추상 클래스내에 구현되어 있는 것입니다. 이것은 서브클래스에서 상속받을 필요가 없습니다.
옵션을 설정하는 등의 경우에 따라 concreteOperation도 상속받아 구현할 필요가 있을 수 있습니다.
그러한 것을 후크(hook)라고 이야기 합니다.
후크를 이용하면 알고리즘의 단계를 옵션에 따라 변경할 수도 있습니다.


디자인 원칙
1. 헐리우드 원칙 - 먼저 연락하지 마세요. 저희가 연락 드리겠습니다.
 
각각의 구성요소들이 언제 어떤식으로 사용되는지를 결정하는 것은 고수준의 구성요소(즉 수퍼 클래스)에서 한다는 의미입니다.
템플릿 메소드 패턴, 팩토리 메소드 패턴, 옵저버 패턴, 커맨드 패턴등이 여기에 따르는 것이 아닐까 합니다.
 
실제로 JAVA API 중 템플릿 메소드 패턴을 사용하는 것은 다음과 같다고 합니다.
 
1. 배열에서의 sort 메소드 (compareTo라는 primitiveOperation 호출)
2. JFrame에서의 paint 메소드 (대표적인 후크 메소드)
3. Applet에서의 init, start, stop, destory, paint 메소드 (역시 후크 메소드..)
 
다음 사항은 유사한 각 패턴의 비교입니다.
 
템플릿 메소드 패턴 - 알고리즘의 일부 단계를 구현하는 것을 서브클래스에서 처리합니다.
스트래티지 패턴 - 바꿔 쓸 수 있는 행동을 캡슐화 하고, 어떤 행동을 사용할 지는 서브클래스에 맡깁니다.
팩토리 메소드 패턴 - 어떤 구상 클래스를 생성할지를 서브 클래스에 결정합니다.
 



Trackback 0 And Comment 0

[디자인 패턴#1] 스트레티지 패턴

|




Strategy Pattern - 디자인 패턴
 
참고서적 :  Head First Design Pattern
소스코드 다운로드 : http://www.wickedlysmart.com/headfirstdesignpatterns/code.html
 
자바의 디자인 패턴을 좀 정리해 두려고 합니다.
나중에 찾아보기 편하려구요~~ 앞으로 이 부분을 공부하면서 연재할 계획입니다.!!
 
패턴 정의 #1 - Strategy Pattern
스트래티지 패턴 (Strategy Pattern)에서는 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다.
스트래티지를 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.
 
디자인 원칙
1. 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다.
2. 구현이 아닌 인터페이스에 맞춰 프로그래밍한다.
3. 상속보다는 구성을 활용한다.
 
음.. 설명이 좀 어렵습니다.
 
특정 클래스(클라이언트)의 여러 가지 행동(알고리즘군)들이 존재할 수 있다면, 이러한 행동들을 인터페이스로 캡슐화해서..
특정 클래스에 인스턴스로 가지고 사용한다는 겁니다.
그렇게 함으로써 특정 클래스와 행동들이 서로 독립적이라는 것이죠..
 
더 여러워 지나요?
다음 그림을 살펴보면 이해가 될 겁니다.
 


 
클라이언트에서는 나는 행동과 꽥꽥거리는 행동 모두에 대해서 캡슐화된 알고리즘군을 활용합니다.
각 행동의 집합을 알고리즘군으로 생각합니다.
이런 행동 "알고리즘"은 바뀔 수 있습니다.
 
fly() 메소드는 모든 Duck 클래스마다 다를 수 있습니다.
먼저 fly() 메소드를 Duck 클래스의 abstract 메소드로 두고 상속으로 처리할 수도 있습니다.
 
하지만, 그럴 경우 같은 동작을 하는 fly() 메소드도 모든 하위 클래스에서 구현되어야 합니다.
소스 코드의 중복이 발생할 수 있는 것이죠~~
 
그래서 FlyBehavior 인터페이스를 만들고 Duck 클래스의 인스턴스로 사용하는 겁니다.  
 
performFly() 메소드를 통해 fly()메소드의 수행을 FlyBehavior 인터페이스로 넘겨주는 거죠~
setFlyBehavior() 메소드를 통해 동적으로 flyBehavior를 지정할 수 있도록 해주기도 합니다.
 
이거는 정리하는 차원이라 간단하게 합니다. ^^
그럼.. 좋은 하루 되세요~~ From 미니



Trackback 0 And Comment 0
prev | 1 | next