flash/DesignPattern | 2007/04/09 21:22

Template method 패턴은 디자인 패턴 중에서도 가장 기본이 되는 패턴중에 하나다.
템플릿이란 단어에서 유추할 수 있듯이 어떤 일정한 틀을 기본으로 클래스를 구성하는 방식이다.
추상클래스(Abstract class) 에 정의되어있는 Abstract method 를 기반으로 알고리즘을 구성하는 template method 를 만들어 동작시키는 것이다. 다시말해 알고리즘의 캡슐화(encapsulation) 라고 할수 있다.

추상클래스(Abstract class) 에서는 단지 알고리즘만 기술하는 역할만 한다. 실제 구현은 서브클래스 (Concrete class) 에서 기술한다. 따라서 Template method 를 이용하면 알고리즘의 구조는 유지하면서 서브클래스에서 추상메소드를 오버라이드하여 재정의 할 수 있다.
서브클래스에서 행동을 지정할 수 있게 하면서도 코드의 재사용이 가능한 특징으로  Template method 패턴은 framework 를 제작하는데 자주 등장한다.

플래시에서는 abstract 키워드가 지원되지 않지만 개념상 큰차이없이 패턴을 사용할 수 있다.

<Abstract class>

class AbstractButton {
 
 private var _mc:MovieClip;
 
 public function setController(inMc : MovieClip) : Void {
  _mc=inMc;
 }
 public function getController() : MovieClip {
  return _mc;
 }
 
 
 //Constructor function
 function AbstractButton(inMc:MovieClip){
  setController(inMc);
  setButton();
 }
 
 
 //Template method
 public function setButton():Void{
     getController().onRollOver=Delegate.create(this,onRollOver);
     getController().onRollOut=Delegate.create(this,onRollOut);
     getController().onRelease=Delegate.create(this,onRelease);
     getController().onReleaseOutside=Delegate.create(this,onReleaseOutside);
 
 }
 
 public function onRollOver() : Void{
  // override in sub-class
  throw new Error("Abstract method!!!!!");
 }

  public function onRollOut() : Void{
   // override in sub-class
  throw new Error("Abstract method!!!!!");
 }

  public function onRelease() : Void{
  // override in sub-class
  throw new Error("Abstract method!!!!!");
 }

  public function onReleaseOutside() : Void{
   // override in sub-class
  throw new Error("Abstract method!!!!!");
 }
 
 
  public function enabled(mode:Boolean):Void{
  // override in sub-class
  throw new Error("Abstract method!!!!!");
 }
 
}


<Concrete class>

class ConcreteButton extends AbstractButton{
 
 function ConcreteButton(inMc:MovieClip){
  super(inMc);
 }
 
 
public function onRollOver() : Void{
  getController().gotoAndPlay("over");
 }

 public function onRollOut() : Void{
  getController().gotoAndPlay("out");
 }

 public function onRelease() : Void{
  getController().gotoAndPlay("release");
 }

 public function onReleaseOutside() : Void{
 
 }
 
 public function enabled(mode:Boolean):Void{
  getController().enabled=mode;
 }
 
}

위 sample 은 버튼을 구성하는 간단한 클래스이다. 
플래시에서 Interaction 을 구현할때 거의 대부분버튼을 구현하여 접근한다. 일반적으로 버튼 액션을 구현하려면 버튼 인스턴스나 무비클립 인스턴스를 통해 버튼 이벤트를 주어서 사용하지만 그럴경우 제어해야할 버튼이 많아지면 코드길이가 늘어날 뿐더러 코드 유연성이 떨어지게 된다.

실제 버튼을 구현하려면 추상클래스를 확장하여 추상메소드를 구현하기만 하면 된다.
추상클래스의 추상메소드의 정의는 개발자가 신중히 결정해서 정해야한다. 추상메소드가 너무 많게 되면 서브클래스에서 구현해야할 코드가 많아져 불편한점이 있을 수 있다. 반대로 너무 추상메소드 자체를 큰 덩어리로 나누게되면 유연성을 떨어뜨리게 된다.


 
 
태그 : , , ,
이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/92
Tracked from { ActionScript 3.0 } 2007/05/16 23:04
제목 : [디자인패턴] 2. 템플릿메소드패턴
사용이 예측되는 메소드들의 집합을 수행하는 템플릿 메소드를 만들고(initialize()), 서브클래스단에서 메소드들을 정의해준다.initialize 메서드의 알고리즘은 그대로 유지한체 추상메서드들만 서브클래스에서구현을 함으로서 코드의 재사용성을 높인다.ex) 인터렉션 버튼(롤오버롤아웃등의 이벤트리스너 등록을 템플릿화하고 리스너함수는 서브클래스에서 제작) package game{ /* 게임의 템플릿에 해당하는 추상클래스 abstract 클래스가 없는..

Name 
Password 
Homepage 
  secret
Comment 
  글쓰기


[PREV] [1] ... [15][16][17][18][19][20][21][22][23] ... [105] [NEXT]

 
전체 (105)
flash (74)
math&physics (4)
programming (11)
Flex2 (1)
Mac (2)
photo (0)
project (6)
주저리주저리 (3)
유용한 자료들 (1)
diary (0)
Book (1)
web (2)
«   2009/01   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31