| 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 을 구현할때 거의 대부분버튼을 구현하여 접근한다. 일반적으로 버튼 액션을 구현하려면 버튼 인스턴스나 무비클립 인스턴스를 통해 버튼 이벤트를 주어서 사용하지만 그럴경우 제어해야할 버튼이 많아지면 코드길이가 늘어날 뿐더러 코드 유연성이 떨어지게 된다.
실제 버튼을 구현하려면 추상클래스를 확장하여 추상메소드를 구현하기만 하면 된다. 추상클래스의 추상메소드의 정의는 개발자가 신중히 결정해서 정해야한다. 추상메소드가 너무 많게 되면 서브클래스에서 구현해야할 코드가 많아져 불편한점이 있을 수 있다. 반대로 너무 추상메소드 자체를 큰 덩어리로 나누게되면 유연성을 떨어뜨리게 된다.
|