<?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>달콤 쌉싸래한 인생 &#187; design pattern</title>
	<atom:link href="http://jongsunkim.pe.kr/archives/category/programming/java/design-pattern/feed" rel="self" type="application/rss+xml" />
	<link>http://jongsunkim.pe.kr</link>
	<description>Be fully awake if you want to dream</description>
	<lastBuildDate>Sat, 19 Nov 2011 08:34:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>MVC2 패턴</title>
		<link>http://jongsunkim.pe.kr/archives/1532</link>
		<comments>http://jongsunkim.pe.kr/archives/1532#comments</comments>
		<pubDate>Sat, 12 Feb 2011 02:07:13 +0000</pubDate>
		<dc:creator>Kim Jong-seon</dc:creator>
				<category><![CDATA[design pattern]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://jongsunkim.pe.kr/?p=1532</guid>
		<description><![CDATA[## MVC 2 pattern * 요청 &#8211;&#62; http://localhost:port/memberInsert/memberinserts?name=”홍길동”&#38;age=20 ftp:// * 뷰(JSP) &#8211;&#62; 1. 읽기 2. 쓰기/수정/삭제 * 컨트롤러(Servlet) &#8211;&#62; 1. 값 추출 2. 값 변환(form으로부터 넘어오는 모든 값의 default는 문자열) 3. 값 검증 4. 비지니스 로직 호출 5. 뷰 선택 6. 예외처리 * 모델(JavaBeans) &#8211;&#62; 1. 서비스 : 비지니스 로직 구현 2. 엔티티 2-1. 드라이버로딩 [...]]]></description>
			<content:encoded><![CDATA[<div><strong>## MVC 2 pattern</strong><br />
* 요청<br />
&#8211;&gt; http://localhost:port/memberInsert/memberinserts?name=”홍길동”&amp;age=20<br />
ftp://<br />
* 뷰(JSP)<br />
&#8211;&gt; 1. 읽기<br />
2. 쓰기/수정/삭제</p>
<p>* 컨트롤러(Servlet)<br />
&#8211;&gt; 1. 값 추출<br />
2. 값 변환(form으로부터 넘어오는 모든 값의 default는 문자열)<br />
3. 값 검증<br />
4. 비지니스 로직 호출<br />
5. 뷰 선택<br />
6. 예외처리</p>
<p>* 모델(JavaBeans)<br />
&#8211;&gt; 1. 서비스<br />
: 비지니스 로직 구현<br />
2. 엔티티<br />
2-1. 드라이버로딩<br />
Class.forName(com.mysql.jdbc.Driver);<br />
2-2. 커넥션 획득<br />
Connection con = DriverManager.getConnection(url, user, passwd);<br />
2-3. Statement 객체 생성<br />
Statement stmt = con.createsStatement();<br />
2-4. 쿼리실행<br />
select 문<br />
ResultSet rs = stmt.executeQuery(“select * from member”);</p>
<p>update, insert, delete 문<br />
int result = stmt.executeUpdate(“insert into values()”);</p>
<p>2-5. ResultSet 결과 처리 (executeQuery() 쿼리 경우에만)<br />
while(rs.next()) {<br />
&#8230;<br />
}<br />
2-6. 자원반납<br />
rs.close(); (executeQuery() 쿼리 경우에만)<br />
stmt.close();<br />
con.close();</p>
<p>* 응답<br />
&#8211;&gt; &lt;html&gt;<br />
&lt;head&gt;&lt;/head&gt;</p>
<p>&lt;body&gt;</p>
<p>홍길동님 가입을 환영합니다.</p>
<p>&lt;/body&gt;</p>
<p>&lt;/html&gt;</p>
<p>**<br />
low coupling : 결합도를 낮추고<br />
high cohesion : 높은 응집력</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://jongsunkim.pe.kr/archives/1532/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>J2EE 디자인 패턴</title>
		<link>http://jongsunkim.pe.kr/archives/1529</link>
		<comments>http://jongsunkim.pe.kr/archives/1529#comments</comments>
		<pubDate>Sat, 12 Feb 2011 02:04:43 +0000</pubDate>
		<dc:creator>Kim Jong-seon</dc:creator>
				<category><![CDATA[design pattern]]></category>

		<guid isPermaLink="false">http://jongsunkim.pe.kr/?p=1529</guid>
		<description><![CDATA[## 라이브러리 vs 컴포넌트 &#8211;&#62; 라이브러리 : 재사용성의 의미만 가지고 있음 &#8211;&#62; 컴포넌트 : 재사용성은 기본이고, MVC에 대한 역할이 들어감 ## 컴포넌트 5가지 1. 클라이언트(.jar) &#8211;&#62; Model(JavaBeans)  ㅏ 2. 웹컴포넌트(.war) &#8211;&#62; View + Controller 3. EJB 컴포넌트(.jar) &#8211;&#62; Model(SessionBean + EntityBean) 4. J2EE 애플리케이션 컴포넌트(.ear) &#8211;&#62; 웹컴포넌트(View + Controller) + EJB 컴포넌트 (Model) 5. 리소스 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>## </strong><strong>라이브러리 vs 컴포넌트<br />
</strong>&#8211;&gt; 라이브러리 : 재사용성의 의미만 가지고 있음<br />
&#8211;&gt; 컴포넌트 : 재사용성은 기본이고, MVC에 대한 역할이 들어감</p>
<p><strong>## </strong><strong>컴포넌트 5가지<br />
</strong>1. 클라이언트(.jar)<br />
&#8211;&gt; Model(JavaBeans)  ㅏ<br />
2. 웹컴포넌트(.war)<br />
&#8211;&gt; View + Controller<br />
3. EJB 컴포넌트(.jar)<br />
&#8211;&gt; Model(SessionBean + EntityBean)<br />
4. J2EE 애플리케이션 컴포넌트(.ear)<br />
&#8211;&gt; 웹컴포넌트(View + Controller) + EJB 컴포넌트 (Model)<br />
5. 리소스 컴포넌트(.rar)<br />
&#8211;&gt; 이미지, 오디오, 플래쉬, 기타..</p>
<p><strong>## EJB 2.1<br />
</strong>&#8211;&gt; SessionBean(StateFull SessionBean 상대유지 세션빈, Stateless SessionBean 무상태 세션빈) + EntityBean(CMP container managements persistance (CMR) / BMP) + MessageDrivenBean<br />
&#8211;&gt; ejbLoad(){ }<br />
&#8211;&gt; ejbStore(){ }</p>
<p><strong>## EJB 3.0</strong><br />
&#8211;&gt; SessionBean + (JPA + JavaBeans) + MessageDrivenBean</p>
<p><strong>## J2EE </strong><strong>패턴</strong><br />
Controller           &#8211;&gt;         Business Delegate &#8211;&gt; Session  Facade &#8211;&gt; Model      Service</p>
<p>Service Locator<br />
<strong>## OR mapping</strong><br />
Class :    Table = 1 : 1<br />
Object : Record = 1 : 1<br />
Field : Column = 1: 1</p>
<p><strong></strong><br />
<strong>## </strong><strong>정리</strong></p>
<p>-Presentation Tier<br />
-Business Tier<br />
-Integration Tier</p>
<p><strong>## Presentation Tier </strong><br />
Intercepting Filter &#8211; http 요청을 가로채서 사전 동작 처리 후 이후 진행 여부를 판단<br />
Front Controller &#8211; 보안, 검증 등 공통된 로직을 한 장소에서 핸들링한다.<br />
Context Object &#8211; 상태를 여러 애플리케이션에서 공유할 수 있도록 특정 프로토콜에 한정되지 않는  방식으로 캡슐화<br />
Application Controller &#8211; 액션과 뷰 관리를 중앙 집중하고 모듈화<br />
View helper &#8211; 프레젠테이션 티어 로직과 관련 없는 로직을 Helper 컴포넌트로 캡슐화<br />
Composite View &#8211; 최소 단위의 하위 컴포넌트를 집합 뷰로 생성<br />
Service to Workers &#8211; Front Controller 와 view Helper 패턴을 혼합 형태로 Controller 가 비즈니스 처리를 요청<br />
Dispatcher View &#8211; Front Controller 와 view Helper 패턴을 혼합 형태로 view 컴포넌트가 디스패처 역할을 하고 비즈니스 처리를 요청한다.</p>
<p><strong>## Business Tier</strong><br />
Business Delegate &#8211; 비즈니스 서비스 접근을 캡슐화. 프레젠테이션 클라이언트와 비즈니스 서비스 간의 커플링을 줄여준다.<br />
Service Locator &#8211; 컴포넌트 룩업과 생성을 위한 오퍼레이션을 하나의 컴포넌트에 정의함으로 코드 중복을 많이 줄이고 캐쉬 기능을 제공한다.<br />
Session Facade &#8211; 복잡한 비즈니스 티어 컴포넌트를 캡슐화하고 원격 클라이언트에게 인터페이스를 제공한다.<br />
Application Service &#8211; 비즈니스 로직을 Session Facade 와 Business Object 사이에 놓기 위한 중심점 제공<br />
Business Object &#8211; 비즈니스 데이터와 로직을 서로 분리<br />
Composite Entity &#8211; 로컬 엔티티 빈과 POJO를 이용하여 하나의 Persistent Business Objetc 로 구현<br />
Transfer Object &#8211; 여러 개의 값을 하나의 오브젝트로 캡슐화 함으로 리모트 호출 횟수를 줄일 수 있다.<br />
Transfer Object Assembler &#8211; 복합 Transfer Objetc 를 만든다.<br />
Value List Handler &#8211; 클라이언트의 요구사항에 따라 쿼리 결과를 관리한다. Iterator 패턴과 유사</p>
<p><strong>## Integration Tier</strong><br />
Data Access Object &#8211; 데이터 액세스 로직을 캡슐화한다.<br />
Service Activator &#8211; 비즈니스 컴포넌트에게 비동기 방식으로 메시지를 전달하는 방법을 제공<br />
Domain Store &#8211; Entity Bean 을 사용하지 않으면서 비즈니스 오브젝트에게 투명한 퍼시스턴스 메커니즘을 제공한다.<br />
Web Service Broker &#8211; 비즈니스 서비스를 웹 서비스 형태로도 서비스 할 때 이를 유연하게 처리할 수 있는 방법을 제공</p>
]]></content:encoded>
			<wfw:commentRss>http://jongsunkim.pe.kr/archives/1529/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>디자인 패턴 정리 1</title>
		<link>http://jongsunkim.pe.kr/archives/1525</link>
		<comments>http://jongsunkim.pe.kr/archives/1525#comments</comments>
		<pubDate>Sat, 12 Feb 2011 01:59:53 +0000</pubDate>
		<dc:creator>Kim Jong-seon</dc:creator>
				<category><![CDATA[design pattern]]></category>

		<guid isPermaLink="false">http://jongsunkim.pe.kr/?p=1525</guid>
		<description><![CDATA[## 객체 지향 디자인 패턴 응집도 &#8211; 하나의 클래스가 하나의 목적에 얼마나 충실하느냐를 가늠하는 척도 캡슐화 &#8211; 자료은닉, 결합도 &#8211; 하나의 클래스가 하나의 응답을 만들어내는데 있어서 몇 개의 클래스와 연동하느냐를 가늠하는 척도 구현상속 &#8211; is-a 관계에서 extends 인터페이스상속 &#8211; implements composition &#8211; has-a 관계, 다형성 - ## 객체지향 디자인 패턴(Object-Oriented Design Patterns) 디자인 패턴 &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p><strong>## 객체 지향 디자인 패턴</strong><br />
응집도 &#8211; 하나의 클래스가 하나의 목적에 얼마나 충실하느냐를 가늠하는 척도<br />
캡슐화 &#8211; 자료은닉,<br />
결합도 &#8211; 하나의 클래스가 하나의 응답을 만들어내는데 있어서 몇 개의 클래스와 연동하느냐를 가늠하는 척도<br />
구현상속 &#8211; is-a 관계에서 extends<br />
인터페이스상속 &#8211; implements<br />
composition &#8211; has-a 관계,<br />
다형성 -</p>
<pre class="brush: java; title: ; notranslate">
//Tight Coupling
class Service {
    String name = “홍길동”;
    String doService() {
        return name;
    }
}
class Client extends Service {

}

class TestClient {
    public static void main(String[] args) {
        Client c = new Client();
        System.out.println(c.doService());
    }
}

//Looser Coupling
class Service {
    String name = “홍길동”;
    String doService() {
        return name;
    }
}

class Client {
    // 클라이언트가 직접 구현하지 않고  분리
    Service s = new Service();    
    String doService() {
        return s.doService();
    }
}

class TestClient {
    public static void main(String[] args) {
        Client c = new Client();
        System.out.println(c.doService());
    }
}

//Looser Abstract Coupling
interface Service {
    String doService();
}
class ServiceImpl implements Service {
    String name = “홍길동”;
    String doService() {
        return name;
    }
}

class Client {
    // 클라이언트가 직접 구현하지 않고  분리
    Service s = new ServiceImpl();
    String doService() {
        return s.doService();
    }
}

class TestClient {
    public static void main(String[] args) {
        Client c = new Client();
        System.out.println(c.doService());
    }
}
//No Coupling
</pre>
<p><strong>## </strong><strong>객체지향 디자인 패턴(Object-Oriented Design Patterns)</strong><br />
디자인 패턴 &#8211; 자주 발생되는 문제들을 해결할 때 일정하게 반복되는 솔루션</p>
<p>-디자인을 통해 얻을 수 있는 특성들</p>
<ul>
<li>유연성</li>
<li>기능확장성</li>
<li>시스템확장성</li>
<li>개발효율성</li>
<li>유지보수성</li>
<li>안정성</li>
<li>성능</li>
<li>재사용성</li>
</ul>
<p><strong>## Object </strong><strong>중심의 디자인 개념</strong></p>
<ul>
<li>응집력 &#8211; 하나의 클래스가 하나의 목적을 얼마나 충실하느냐를 가늠하는 척도</li>
<li>캡슐화 &#8211; 자료은닉</li>
<li>결합도 &#8211; 하나의 클래스가 하나의 응답을 만들어내는데 있어서</li>
<li>구현상속 &#8211; is-a 관계에서 extends</li>
<li>인터페이스상속 &#8211; implements</li>
<li>합성 &#8211; has-a 관계에서</li>
<li>다형성 -</li>
</ul>
<p><strong>## </strong><strong>오브젝트 중심의 디자인 원칙</strong><br />
Favoring Composition &#8211; 구현상속보다는 Object Composition 선호<br />
Programming to an Interface<br />
Designing for Change &#8211; “OCP(Open-Closed Principle)” &#8211; 기존의 소스나 구현부에 영향을 덜 주면서 새로운 기능 추가</p>
<p><strong>## GoF </strong><strong>디자인 패턴</strong></p>
<ul>
<li>동작(Behavioral) 패턴</li>
<li>생성(Creational) 패턴</li>
<li>구조(Structural) 패턴</li>
</ul>
<p><strong>## </strong><strong>동작 패턴</strong><br />
-오브젝트가 어떻게 상호작용하고 기능을 분할하는가에 대한 방법 종류<br />
Strategy &#8211; 클래스 내에 관련된 알고리즘이 캡슐화되어 필요에 따라 교환<br />
Command &#8211; 명령어들이 캡슐화 되어 명령어를 선택하여 실행한다. 실행 순서 및 방법을 별도로 관리<br />
Iterator &#8211; 집합 객체를 종류에 관계없이 동일한 방법으로 접근<br />
Observer &#8211; polling 방식을 사용하지 않고 관찰 대상의 상태를 관찰자에게 통지</p>
<p><strong>## </strong><strong>생성 패턴</strong><br />
- 좀 더 견고한 방법으로 오브젝트를 생성하는 방법<br />
Factory Method &#8211; 생성할 클래스를 서브 클래스에서 결정<br />
Abstract Factory &#8211; 생성할 인터페이스를 제공하고 관련된 객체들의 여러군을 반환<br />
Singleton &#8211; 하나의 객체만 메모리에 생성<br />
Builder &#8211; 객체의 내용과 형태를 지정하면 복잡한 객체를 구성<br />
Prototype &#8211; 프로토타입의 객체를 생성 후 그것을 복사하여 원하는 객체를 생성</p>
<p><strong>## </strong><strong>구조 패턴</strong><br />
-객체가 서로 어떻게 연결하는가에 대한 방법<br />
Facade &#8211; 단일 객체가 전체 하위 객체를 표현할 수 있다. 즉 서브  클래스에 대한 인터페이스 제공<br />
Proxy &#8211; 나중에 호출될 수 있는 복합 객체를 대신하는 단순 객체를 생성한다. 즉 객체의 대리자 역할을 하는 객체를 사용한다.<br />
Adapter &#8211; 클래스를 확장할 때 상속받는 ClassAdapter 와 연관관계를 맺는 ObjectAdapter로 구분된다.<br />
Composite &#8211; 객체를 생성하여 단순 객체와 합성 객체로 관리될 수 있다.<br />
Decorate &#8211; 객체의 책임을 동적으로 추가할 수 있다.</p>
]]></content:encoded>
			<wfw:commentRss>http://jongsunkim.pe.kr/archives/1525/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts framework and model-view-controller design pattern</title>
		<link>http://jongsunkim.pe.kr/archives/1115</link>
		<comments>http://jongsunkim.pe.kr/archives/1115#comments</comments>
		<pubDate>Thu, 15 Jul 2010 09:25:50 +0000</pubDate>
		<dc:creator>Kim Jong-seon</dc:creator>
				<category><![CDATA[design pattern]]></category>

		<guid isPermaLink="false">http://jongsunkim.pe.kr/?p=1115</guid>
		<description><![CDATA[http://publib.boulder.ibm.com/infocenter/rtnlhelp/v6r0m0/index.jsp?topic=/com.ibm.etools.struts.doc/topics/cstrdoc001.html]]></description>
			<content:encoded><![CDATA[<p><a href="http://publib.boulder.ibm.com/infocenter/rtnlhelp/v6r0m0/index.jsp?topic=/com.ibm.etools.struts.doc/topics/cstrdoc001.html" target="_blank">http://publib.boulder.ibm.com/infocenter/rtnlhelp/v6r0m0/index.jsp?topic=/com.ibm.etools.struts.doc/topics/cstrdoc001.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jongsunkim.pe.kr/archives/1115/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GoF 디자인 패턴 레퍼런스 카드</title>
		<link>http://jongsunkim.pe.kr/archives/832</link>
		<comments>http://jongsunkim.pe.kr/archives/832#comments</comments>
		<pubDate>Wed, 21 Apr 2010 06:55:47 +0000</pubDate>
		<dc:creator>Kim Jong-seon</dc:creator>
				<category><![CDATA[design pattern]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://jongsunkim.pe.kr/?p=832</guid>
		<description><![CDATA[Design Patterns Quick Reference http://www.mcdonaldland.info/2007/11/28/40/]]></description>
			<content:encoded><![CDATA[<p>Design Patterns Quick Reference</p>
<p><a href="http://www.mcdonaldland.info/2007/11/28/40/" target="_blank">http://www.mcdonaldland.info/2007/11/28/40/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jongsunkim.pe.kr/archives/832/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Template Method 패턴</title>
		<link>http://jongsunkim.pe.kr/archives/744</link>
		<comments>http://jongsunkim.pe.kr/archives/744#comments</comments>
		<pubDate>Sat, 13 Mar 2010 01:10:22 +0000</pubDate>
		<dc:creator>Kim Jong-seon</dc:creator>
				<category><![CDATA[design pattern]]></category>

		<guid isPermaLink="false">http://jongsunkim.pe.kr/?p=744</guid>
		<description><![CDATA[Template Method 패턴이란 템플릿의 기능을 가진 패턴. 상위 클래스 쪽에 탬플릿에 해당하는 메소드가 정의되어 있고, 그 메소드의 정의 안에는 추상 메소드가 사용되고 있다. 따라서 상위 클래스의 프로그램만 보면 추상 메소드를 어떻게 호출하고 있는지 알 수 있지만, 최족적으로 어떤 처리가 수행되는지는 알 수 없다. 추상 메소드를 실제로 구현하는 것은 하위 클래스이다. 하위 클래스 측에서 메소드를 구현하면 [...]]]></description>
			<content:encoded><![CDATA[<h2>Template Method 패턴이란</h2>
<p>템플릿의 기능을 가진 패턴. 상위 클래스 쪽에 탬플릿에 해당하는 메소드가 정의되어 있고, 그 메소드의 정의 안에는 추상 메소드가 사용되고 있다. 따라서 상위 클래스의 프로그램만 보면 추상 메소드를 어떻게 호출하고 있는지 알 수 있지만, 최족적으로 어떤 처리가 수행되는지는 알 수 없다.</p>
<p>추상 메소드를 실제로 구현하는 것은 하위 클래스이다. 하위 클래스 측에서 메소드를 구현하면 구체적인 처리가 결정된다. 서로 다른 하위 클래스가 서로 다른 구현을 실행하면 서로 다른 처리가 실행될 것이다. 그러나 어떤 하위 클래스에서 어떤 구현을 하더라도 처리의 큰 흐름은 상위 클래스에서 결정한대로 이루어진다. 이와 같이 상위 클래스에서 처리의 뼈대를 결정하고, 하위 클래스에서 그 구체적인 내용을 결정하는 디자인 패턴을 Template Method 패턴 이라고 부른다.</p>
<h2>Template Method 패턴의 등장인물</h2>
<h5>AbstractClass(추상 클래스)의 역할</h5>
<p>AbstractClass는 템플릿 메소드를 구현한다. 또한 그 템플릿 메소드에서 사용하고 있는 추상 메소드를 선언한다. 이 추상 메소드는 하위 클래스인 ConcreteClass 역할에 의해 구현된다.</p>
<h5>ConcreteClass(구현 클래스)의 역할</h5>
<p>AbstractClass 역할에서 정의되어 있는 추상 메소드를 구체적으로 구현한다. 여기에서 구현한 메소드는 AbstractClass 역의 템플릿 메소드에서 호출된다.</p>
]]></content:encoded>
			<wfw:commentRss>http://jongsunkim.pe.kr/archives/744/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adapter 패턴</title>
		<link>http://jongsunkim.pe.kr/archives/731</link>
		<comments>http://jongsunkim.pe.kr/archives/731#comments</comments>
		<pubDate>Fri, 12 Mar 2010 08:23:13 +0000</pubDate>
		<dc:creator>Kim Jong-seon</dc:creator>
				<category><![CDATA[design pattern]]></category>

		<guid isPermaLink="false">http://jongsunkim.pe.kr/?p=731</guid>
		<description><![CDATA[Adapter 패턴에는 다음과 같이 두 가지 종류가 있습니다. 클래스에 의한 Adapter 패턴(상속을 사용한 Adapter 패턴) 인스턴스에 의한 Adapter 패턴(위임을 사용한 Adapter 패턴) Adapter 패턴의 등장인물 Target(대상)의 역할 지금 필요한 메소드를 결정합니다. Client(의뢰자)의 역할 Target 역할의 메소드를 사용해서 일을 합니다. 예제 프로그램에서 Main클래스가 이 역할. Adaptee(개조되는 쪽)의 역할 Adapt-er(개조하는 쪽)이 아니고 Adapt-ee(개조되는 쪽)입니다. Adaptee는 이미 준비되어 [...]]]></description>
			<content:encoded><![CDATA[<p>Adapter 패턴에는 다음과 같이 두 가지 종류가 있습니다.</p>
<ul>
<li>클래스에 의한 Adapter 패턴(상속을 사용한 Adapter 패턴)</li>
<li>인스턴스에 의한 Adapter 패턴(위임을 사용한 Adapter 패턴)</li>
</ul>
<h2>Adapter 패턴의 등장인물</h2>
<p><strong>Target(대상)의 역할</strong></p>
<p>지금 필요한 메소드를 결정합니다.</p>
<p><strong>Client(의뢰자)의 역할</strong></p>
<p>Target 역할의 메소드를 사용해서 일을 합니다. 예제 프로그램에서 Main클래스가 이 역할.</p>
<p><strong>Adaptee(개조되는 쪽)의 역할</strong></p>
<p>Adapt-er(개조하는 쪽)이 아니고 Adapt-ee(개조되는 쪽)입니다. Adaptee는 이미 준비되어 있는 메소드를 가지고 있는 역할을 합니다.</p>
<p><strong>Adapter의 역할</strong></p>
<p>Adapter 패턴의 주인공입니다. Adpater 역할의 메소드를 사용해서 어떻게든 Target 역할을 만족시키기 위한 것이 Adapter 패턴의 목적이며, Adapter 역할의 임무입니다.</p>
<p>클래스에 의한 Adpater 패턴의 경우에는 Adapter의 역할을 &#8216;상속&#8217; 을 사용한 Adaptee의 역할을 이용하지만, 인스턴스에 의한 Adapter 패턴의 경우에는 &#8216;위임&#8217; 을 사용한 Adaptee의 역할을 이용합니다.</p>
<h2>어떤 경우에 사용하는 것일까?</h2>
<p>Adapter 패턴은 기존의 클래스를 개조해서 필요한 클래스를 만듭니다. 이 패턴으로 필요한 메소드를 발빠르게 만들 수 있습니다. 만약 버그가 발생해도 기존의 클래스(Adaptee의 역할)에는 버그가 없으므로 Adapter 역할의 클래스를 중점적으로 조사하면 되고, 프로그램 검사도 상당히 쉬워집니다.</p>
]]></content:encoded>
			<wfw:commentRss>http://jongsunkim.pe.kr/archives/731/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Iterator 패턴</title>
		<link>http://jongsunkim.pe.kr/archives/639</link>
		<comments>http://jongsunkim.pe.kr/archives/639#comments</comments>
		<pubDate>Tue, 02 Mar 2010 10:10:00 +0000</pubDate>
		<dc:creator>Kim Jong-seon</dc:creator>
				<category><![CDATA[design pattern]]></category>

		<guid isPermaLink="false">http://jongsunkim.pe.kr/?p=639</guid>
		<description><![CDATA[Iterator 패턴이란, 무엇인가 많이 모여있는 것들을 순서대로 지정하면서 전체를 검색하는 처리를 실행하기 위한 것이다. iterator는 무엇인가를 &#8216;반복한다&#8217; 라는 의미이며, 반복자라고도 한다. Aggregate 인터페이스 Aggregate 인터페이스는 요소들이 나열되어 있는 &#8216;집합체&#8217;를 나타낸다. 이 인터페이스를 구현하고 있는 클래스는 배열과 같은 무엇인가가 많이 모여 있다. Iterator 인터페이스 Iterator 인터페이스는 요소를 하나씩 나열하면서 루프 변수와 같은 역할을 수행한다. &#8216;다음 요소&#8217; 가 [...]]]></description>
			<content:encoded><![CDATA[<p>Iterator 패턴이란, 무엇인가 많이 모여있는 것들을 순서대로 지정하면서 전체를 검색하는 처리를 실행하기 위한 것이다. iterator는 무엇인가를 &#8216;반복한다&#8217; 라는 의미이며, 반복자라고도 한다.</p>
<h2>Aggregate 인터페이스</h2>
<p>Aggregate 인터페이스는 요소들이 나열되어 있는 &#8216;집합체&#8217;를 나타낸다. 이 인터페이스를 구현하고 있는 클래스는 배열과 같은 무엇인가가 많이 모여 있다.</p>
<pre class="brush: java; title: ; notranslate">
public interface Aggregate {
    public abstract Iterator iterator();
}
</pre>
<h2>Iterator 인터페이스</h2>
<p>Iterator 인터페이스는 요소를 하나씩 나열하면서 루프 변수와 같은 역할을 수행한다.</p>
<p>&#8216;다음 요소&#8217; 가 존재하는지를 조사하기 위한 boolean형 hasNext 메소드</p>
<p>&#8216;다음 요소&#8217; 를 얻기 위한 Object형 next 메소드</p>
<pre class="brush: java; title: ; notranslate">
public interface Iterator {
    public abstract boolean hasNext();
    public abstract Object next();
}
</pre>
<h2>Book 클래스</h2>
<ul>
<li>문자열을 저장하는 name</li>
<li>문자열을 받는 생성자</li>
<li>책 이름을 반환하는 getName 메소드</li>
</ul>
<pre class="brush: java; title: ; notranslate">
public class Book {
	private String name;
	public Book(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
}
</pre>
<h2>BookShelf 클래스</h2>
<p>Aggregate 인터페이스를 구현</p>
<pre class="brush: java; title: ; notranslate">
public class BookShelf implements Aggregate {
	private Book[] books;
	private int last = 0;
	public BookShelf(int maxsize){
		this.books = new Book[maxsize];
	}
	public Book getBookAt(int index){
		return books[index];
	}
	public void appendBook(Book book){
		this.books[last] = book;
		last++;
	}
	public int getLength(){
		return last;
	}
	public Iterator iterator(){
		return new BookShelfIterator(this);
	}
}
</pre>
<h2>BookShelfIterator 클래스</h2>
<pre class="brush: java; title: ; notranslate">
public class BookShelfIterator implements Iterator{
	private BookShelf bookShelf;
	private int index;

	public BookShelfIterator(BookShelf bookShelf){
		this.bookShelf = bookShelf;
		this.index = 0;
	}
	public boolean hasNext(){
		if(index &amp;lt; bookShelf.getLength()){
			return true;
		}
		else{
			return false;
		}
	}
	public Object next(){
		Book book = bookShelf.getBookAt(index);
		index++;
		return book;
	}
}
</pre>
<h2>Main 클래스</h2>
<pre class="brush: java; title: ; notranslate">
public class Main {
	public static void main(String[] args) {
		BookShelf bookShelf = new BookShelf(4);		// index = 4
		bookShelf.appendBook(new Book(&amp;quot;Around the World in 80 Days&amp;quot;));
		bookShelf.appendBook(new Book(&amp;quot;Bible&amp;quot;));
		bookShelf.appendBook(new Book(&amp;quot;Cinderella&amp;quot;));
		bookShelf.appendBook(new Book(&amp;quot;Daddy-Long-Legs&amp;quot;));

		Iterator it = bookShelf.iterator();

		/*
		 * while 루프가 돌아가고, 루프 내에서 it.next()에 의해
		 * 책을 한 권씩 조사하게 된다.
		 */
		while(it.hasNext()){
			Book book = (Book)it.next();
			System.out.println(book.getName());
		}
	}
}
</pre>
<h2>Iterator 패턴의 등장인물</h2>
<p>Iterator(반복자)의 역할 : 요소를 순서대로 검색해가는 인터페이스(API)를 결정</p>
<p>ConcreteIterator(구체적인 반복자)의 역할 : Iterator가 결정한 인터페이스(API)를 실제로 구현</p>
<p>Aggregate(집합체)의 역할 : Iterator 역할을 만들어내는 인터페이스(API)를 결정</p>
<p>ConcreteAggregate(구체적인 집합체)의 역할 : Aggregate 역할이 결정한 인터페이스(API)를 실제로 구현하는 일</p>
]]></content:encoded>
			<wfw:commentRss>http://jongsunkim.pe.kr/archives/639/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

