영어 정리 잘 되어있는 사이트: http://vincehuston.org/dp
doc 문서: http://trozan.tistory.com/entry/%EB%AC%B8%EC%84%9C-GoF%EC%9D%98-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%A0%95%EB%A6%AC
'SE > RF_DP' 카테고리의 다른 글
Decorator Pattern (0) | 2010.07.15 |
---|
Decorator Pattern (0) | 2010.07.15 |
---|
안녕하세요. moltak입니다.
오늘은 디자인 패턴 중 데코레이터 패턴입니다.
의도:
데코레이터 패턴은 어떤 클래스를 꾸미는 역할을 합니다.
예전에 우리가 만들었던 코드를 "감싸"서 새로운 임무를 부여하는 것이 가능합니다.
"감싸"다는 말은 이 패턴에서 굉장히 중요합니다.
활용성:
제가 보는 책(head first design patterns)에서는 데코레이션 패턴을 커피 예를 들어서 설명을 했습니다.
커피집에 가면 커피가 굉장히 많은데 그 커피에 대한 클래스를 만들고 모든 재료, 기능들을 넣는 것 보단 커피 클래스 따로 재료 클래스 따로 만들고 있었습니다.
커피 클래스, 재료 클래스를 따로 만들게 되었을 때 서로 유기적으로 잘 묶기만 한다면 한 클래스에 모든 기능을 넣는 것 보단 당연히 구조적으로 좋겠죠?
데코레이션 패턴에서는 유기적으로 묶는 방법으로 "감싸"는 것을 선택했습니다.
위 클래스 다이어그램을 보시면 가장 상위에 Coffee 추상 클래스가 보입니다.
그 아래로 그것을 상속받는 Americano, Espresso, Cafelatte같은 클래스가 있습니다.
또, Decorator라는 추상클래스가 있는데 이 클래스는 getDescription이라는 순수가상함수를 갖고 있습니다.
그래서 아래 재료들이 무조건 이 함수를 새로 정의하게 만들었습니다.
이 패턴의 시나리오는 위 소스에서 보는 것과 같이 원하는 커피 인스턴스를 생성하고 원하는 재료를 만들어서 서로에게 계속 참조를 시킨다는 것입니다. (감싼다는 의미가 이것입니다.)
사용자가 getDescription함수를 호출하거나 cost 함수를 호출하면 제어가 계속 참조하는 곳으로 올라가게 됩니다.
(아래 소스 참조)
이런 식으로 사용자는 예전부터 있던 클래스를 하나도 수정하지 않고 단지 "감싸"서 예전 클래스에 새로운 기능을 부여하는 것이 가능합니다.
Bloger : moltak.net
Design Pattern 도움 사이트 (0) | 2011.03.15 |
---|
옵져버 패턴입니다.
의도:
일대다의 관견성을 갖는 객체들의 경우 한 객체의 상태가 변하면 다른 모든 객체에게 그 사항을 알리고 필요한 수정이 자동으로 이루어지도록 할 수 있어야 한다.
활용성:
추상화 개념이 두 가지의 측면을 갖고 하나가 다른 하나에 종속적일 때. 이런 종속 관계를 하나의 객체로 분리시켜 이들 각각을 재사용할 수 있다.
한 객체에 가해진 변경으로 다른 객체를 변경해야 할 때 프로그래머들은 얼마나 많은 객체들이 변경되어야 하는지를 몰라도 된다.
객체는 다른 객체에 변화를 통보할 수 있는데, 변화에 관심 있어 하는 객체들이 누구인지에 대한 가정 없이도 이루어져야 할 때.
보통 GUI 툴킷을 이용해서 프로그램을 작성하면 사용자에게 보여주는 UI와 데이터는 따로 나눠서 관리하게 됩니다. 그런 상황에서 하나의 데이터와 여러 개의 UI가 있을 경우 데이터를 공유시켜야 합니다. 그런 상황에서 옵져버 패턴을 사용하게 되면 굉장히 편합니다. Subject의 상태가 변화됨에 따라 Observer들의 상태가 자동으로 바뀌기 때문입니다.
Subject를 상속받는 ObserverManager의 상태가 변경되면 그 변경사항들이 옵져버들에게 반영됩니다.
Bloger: moltak.net
UML: 클래스 다이어그램 기초 (0) | 2010.07.08 |
---|---|
① 사용자 요구조건 조사 (0) | 2010.03.18 |
02] XP 개발 주기의 개괄 (0) | 2010.03.18 |
01] XP 정의, 4개 구성 (0) | 2010.03.18 |
IL Code에 심볼 정보가 포함되는 이유 (0) | 2010.04.24 |
---|---|
초기화 하지 않은 메모리 (0) | 2010.04.16 |
typeid 연산자 (1) | 2010.04.15 |
enum 문자열 (0) | 2010.04.09 |
ASCII Table (0) | 2010.04.05 |