<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kimkijeung.com &#187; Template method pattern</title>
	<atom:link href="http://kimkijeung.com/tag/template-method-pattern/feed/" rel="self" type="application/rss+xml" />
	<link>http://kimkijeung.com</link>
	<description>Interactive development,flash,Actionscript,Unity</description>
	<lastBuildDate>Sun, 24 Apr 2011 18:59:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Template method pattern</title>
		<link>http://kimkijeung.com/2007/04/09/template-method-pattern/</link>
		<comments>http://kimkijeung.com/2007/04/09/template-method-pattern/#comments</comments>
		<pubDate>Mon, 09 Apr 2007 12:21:33 +0000</pubDate>
		<dc:creator>vkimone</dc:creator>
				<category><![CDATA[Programming-OOP&OOD]]></category>
		<category><![CDATA[AS2.0]]></category>
		<category><![CDATA[Design pattern]]></category>
		<category><![CDATA[Template method pattern]]></category>

		<guid isPermaLink="false">http://vkimone.inblog.kr/?p=445</guid>
		<description><![CDATA[Template method 패턴은 디자인 패턴 중에서도 가장 기본이 되는 패턴중에 하나다. 템플릿이란 단어에서 유추할 수 있듯이 어떤 일정한 틀을 기본으로 클래스를 구성하는 방식이다. 추상클래스(Abstract class) 에 정의되어있는 Abstract method 를 기반으로 알고리즘을 구성하는 template method 를 만들어 동작시키는 것이다. 다시말해 알고리즘의 캡슐화(encapsulation) 라고 할수 있다. 추상클래스(Abstract class) 에서는 단지 알고리즘만 기술하는 역할만 한다. 실제 구현은 [...]]]></description>
			<content:encoded><![CDATA[<p>Template method 패턴은 디자인 패턴 중에서도 가장 기본이 되는 패턴중에 하나다.<br />
템플릿이란 단어에서 유추할 수 있듯이 어떤 일정한 틀을 기본으로 클래스를 구성하는 방식이다.<br />
추상클래스(Abstract class) 에 정의되어있는 Abstract method 를 기반으로 알고리즘을 구성하는 template method 를 만들어 동작시키는 것이다. 다시말해 알고리즘의 캡슐화(encapsulation) 라고 할수 있다.</p>
<p>추상클래스(Abstract class) 에서는 단지 알고리즘만 기술하는 역할만 한다. 실제 구현은 서브클래스 (Concrete class) 에서 기술한다. 따라서 Template method 를 이용하면 알고리즘의 구조는 유지하면서 서브클래스에서 추상메소드를 오버라이드하여 재정의 할 수 있다.<br />
서브클래스에서 행동을 지정할 수 있게 하면서도 코드의 재사용이 가능한 특징으로  Template method 패턴은 framework 를 제작하는데 자주 등장한다.</p>
<p>플래시에서는 abstract 키워드가 지원되지 않지만 개념상 큰차이없이 패턴을 사용할 수 있다.</p>
<p><strong>&lt;Abstract class&gt;<br />
</strong></p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> AbstractButton <span style="color: #66cc66;">&#123;</span>
&nbsp;
 <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _mc:<span style="color: #0066CC;">MovieClip</span>;
&nbsp;
 <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setController<span style="color: #66cc66;">&#40;</span>inMc : <span style="color: #0066CC;">MovieClip</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">Void</span> <span style="color: #66cc66;">&#123;</span>
  _mc=inMc;
 <span style="color: #66cc66;">&#125;</span>
 <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getController<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">MovieClip</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #b1b100;">return</span> _mc;
 <span style="color: #66cc66;">&#125;</span>
&nbsp;
 <span style="color: #808080; font-style: italic;">//Constructor function</span>
 <span style="color: #000000; font-weight: bold;">function</span> AbstractButton<span style="color: #66cc66;">&#40;</span>inMc:<span style="color: #0066CC;">MovieClip</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
  setController<span style="color: #66cc66;">&#40;</span>inMc<span style="color: #66cc66;">&#41;</span>;
  setButton<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
 <span style="color: #66cc66;">&#125;</span>
&nbsp;
 <span style="color: #808080; font-style: italic;">//Template method</span>
 <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setButton<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Void</span><span style="color: #66cc66;">&#123;</span>
     getController<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #0066CC;">onRollOver</span>=Delegate.<span style="color: #006600;">create</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>,<span style="color: #0066CC;">onRollOver</span><span style="color: #66cc66;">&#41;</span>;
     getController<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #0066CC;">onRollOut</span>=Delegate.<span style="color: #006600;">create</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>,<span style="color: #0066CC;">onRollOut</span><span style="color: #66cc66;">&#41;</span>;
     getController<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #0066CC;">onRelease</span>=Delegate.<span style="color: #006600;">create</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>,<span style="color: #0066CC;">onRelease</span><span style="color: #66cc66;">&#41;</span>;
     getController<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #0066CC;">onReleaseOutside</span>=Delegate.<span style="color: #006600;">create</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>,<span style="color: #0066CC;">onReleaseOutside</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
 <span style="color: #66cc66;">&#125;</span>
&nbsp;
 <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">onRollOver</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">Void</span><span style="color: #66cc66;">&#123;</span>
  <span style="color: #808080; font-style: italic;">// override in sub-class</span>
  <span style="color: #0066CC;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Error</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Abstract method!!!!!&quot;</span><span style="color: #66cc66;">&#41;</span>;
 <span style="color: #66cc66;">&#125;</span>
  <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">onRollOut</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">Void</span><span style="color: #66cc66;">&#123;</span>
   <span style="color: #808080; font-style: italic;">// override in sub-class</span>
  <span style="color: #0066CC;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Error</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Abstract method!!!!!&quot;</span><span style="color: #66cc66;">&#41;</span>;
 <span style="color: #66cc66;">&#125;</span>
  <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">onRelease</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">Void</span><span style="color: #66cc66;">&#123;</span>
  <span style="color: #808080; font-style: italic;">// override in sub-class</span>
  <span style="color: #0066CC;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Error</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Abstract method!!!!!&quot;</span><span style="color: #66cc66;">&#41;</span>;
 <span style="color: #66cc66;">&#125;</span>
  <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">onReleaseOutside</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">Void</span><span style="color: #66cc66;">&#123;</span>
   <span style="color: #808080; font-style: italic;">// override in sub-class</span>
  <span style="color: #0066CC;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Error</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Abstract method!!!!!&quot;</span><span style="color: #66cc66;">&#41;</span>;
 <span style="color: #66cc66;">&#125;</span>
&nbsp;
  <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">enabled</span><span style="color: #66cc66;">&#40;</span>mode:<span style="color: #0066CC;">Boolean</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Void</span><span style="color: #66cc66;">&#123;</span>
  <span style="color: #808080; font-style: italic;">// override in sub-class</span>
  <span style="color: #0066CC;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Error</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Abstract method!!!!!&quot;</span><span style="color: #66cc66;">&#41;</span>;
 <span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p><strong>&lt;Concrete class&gt;<br />
</strong></p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> ConcreteButton <span style="color: #0066CC;">extends</span> AbstractButton<span style="color: #66cc66;">&#123;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> ConcreteButton<span style="color: #66cc66;">&#40;</span>inMc:<span style="color: #0066CC;">MovieClip</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
<span style="color: #0066CC;">super</span><span style="color: #66cc66;">&#40;</span>inMc<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">onRollOver</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">Void</span><span style="color: #66cc66;">&#123;</span>
getController<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #0066CC;">gotoAndPlay</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;over&quot;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">onRollOut</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">Void</span><span style="color: #66cc66;">&#123;</span>
getController<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #0066CC;">gotoAndPlay</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;out&quot;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">onRelease</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">Void</span><span style="color: #66cc66;">&#123;</span>
getController<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #0066CC;">gotoAndPlay</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;release&quot;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">onReleaseOutside</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">Void</span><span style="color: #66cc66;">&#123;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">enabled</span><span style="color: #66cc66;">&#40;</span>mode:<span style="color: #0066CC;">Boolean</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Void</span><span style="color: #66cc66;">&#123;</span>
getController<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #0066CC;">enabled</span>=mode;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>위 sample 은 버튼을 구성하는 간단한 클래스이다.<br />
플래시에서 Interaction 을 구현할때 거의 대부분버튼을 구현하여 접근한다. 일반적으로 버튼 액션을 구현하려면 버튼 인스턴스나 무비클립 인스턴스를 통해 버튼 이벤트를 주어서 사용하지만 그럴경우 제어해야할 버튼이 많아지면 코드길이가 늘어날 뿐더러 코드 유연성이 떨어지게 된다.</p>
<p>실제 버튼을 구현하려면 추상클래스를 확장하여 추상메소드를 구현하기만 하면 된다.<br />
추상클래스의 추상메소드의 정의는 개발자가 신중히 결정해서 정해야한다. 추상메소드가 너무 많게 되면 서브클래스에서 구현해야할 코드가 많아져 불편한점이 있을 수 있다. 반대로 너무 추상메소드 자체를 큰 덩어리로 나누게되면 유연성을 떨어뜨리게 된다.</p>
]]></content:encoded>
			<wfw:commentRss>http://kimkijeung.com/2007/04/09/template-method-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

