SlideShare ist ein Scribd-Unternehmen logo
1 von 16
컴포지트 패턴
  (Composite Pattern)
멀티플랫폼 지원관점에서... - MindHD 사례
컴포지트 패턴

컴포지트 패턴는 각각의 객체를 복
합객체로 만든다.

드로잉 객체를 복합하여 관리하기
위해 컴포지트 패턴을 이용한다.

이미지(돋보기, 포스트잇),
텍스트 인스턴스를 조합할 수 있다.
멀티플랫폼 이슈

어떻게 멀티플랫폼(Win,Mac,iOS, WWW ... ) 을 지원할 것
인가?
컴포지트 패턴 메소드 호출

     컴포지트 패턴의 메소드 호출은
     복합객체에서 단말객체로 단방향 호출이 이루어진다.
                                 void Document::Draw(Painter* pPainter)
                                 {
void View::OnDraw(CDC* pDC)        graphics_->Draw(pPainter);
{                                }
  WinPainter aPainter(pDC);
  pDocument_->Draw(&aPainter);
}                                void Picture::Draw(Painter* pPainter)
                                 {
                                   Iterator* iter = ...
                                   while(iter->HasObject())
                                      iter->Draw(pPainter);
                                 }



                                 void Rect::Draw(Painter* pPainter)
                                 {
                                   // draw rect
                                 }


                                 void Text::Draw(Painter* pPainter)
                                 {
                                   // draw text
                                 }
컴포지트 패턴 메소드 호출

     컴포지트 패턴의 메소드 호출은
     복합객체에서 단말객체로 단방향 호출이 이루어진다.
                                 void Document::Draw(Painter* pPainter)
                                 {
void View::OnDraw(CDC* pDC)        graphics_->Draw(pPainter);
{                                }
  WinPainter aPainter(pDC);
  pDocument_->Draw(&aPainter);
}                                void Picture::Draw(Painter* pPainter)
                                 {
                                   Iterator* iter = ...
                                   while(iter->HasObject())
                                      iter->Draw(pPainter);
                                 }



                                 void Rect::Draw(Painter* pPainter)
                                 {
                                   // draw rect
                                 }
                                                                          멀티플랫폼 지원
                                 void Text::Draw(Painter* pPainter)
                                 {
                                   // draw text
                                 }
조건부 컴파일



조건부 컴파일로 어느 정도 해결.

지원 객체와 플랫폼이 늘어나면 관리 이슈 발생함.

OOP적 해결방식은?
플랫폼별 상속

각 객체를 상속받은 Draw() 메소드에서 플랫폼별로 드로
잉 작업을 수행한다.

                                 Rect                             Text

                 WinRect                             WinText
                                        MacRect                         MacText

void MacRect::Draw(Painter* pPainter) {            void WinRect::Draw(Painter* pPainter)
  
  CGContextRef context = pPainter->Context();   {

    CGContextAddRect(context, rect);                CDC* pDC = pPainter->Context();

    CGContextStrokePath(context);                   pDC->DrawRect(...);
}                                                  }
각 플랫폼별 상속 장단점


플랫폼별 하위 클래스를 생성해야 한다.

객체 또는 플랫폼이 늘어나는 경우 대처가 힘들다.

파일 단위로 구분한 경우 파일 관리가 힘들 수 있다.

파일 단위 구분은 작업 단위가 명확할 수 있는 장점.

Abstract Factory 패턴과 연동.
이터레이터 패턴

      각 플랫폼별 뷰에서 개체를 순회하며 드로잉한다.

               Iterator
                                                          class Iterator
                                                          {
                                                          public:
                                                          
    Iterator();
                                                          
    virtual ~Iterator();
                                                          
                                                          
    virtual const Glyph* Next() const = 0;
                                                          
    virtual bool HasNext() const = 0;

   CompositeIterator                                      };




void View::OnDraw(CDC* pDC)                                    - (void)drawRect:(CGRect)rect {
{                                                                
    CGContextRef context = UIGraphicsGetCurrentContext();
  Iterator* iter = pDocument_->CreateIterator();                   Iterator* iter = pDocument_->CreateIterator();
  while(!iter->HasNext())                                          while(!iter->HasNext())
  {                                                                {
      Rect* r = dynamic_cast<Rect*>((*iter)->Object());                Rect* r = dynamic_cast<Rect*>((*iter)->Object());
      pDC->DrawRect(...);                                      
          CGContextAddRect(context, r->Rect());
      pDC->DrawText(...);                                              DrawText(context,...);
      iter->Next();                                                    iter->Next();
  }                                                                }
}                                                              }
이터레이터 패턴

단순 명확하다.(이터레이터 패턴 추가 제외)

뷰는 컴포지트 패턴에 의존한다.

 컴포지트 패턴 변경시
 각 플랫폼별 뷰 (드로잉)을 변경해야 한다.

뷰에서 하위 형변환이 발생한다.

유연/확장성이 떨어질 수 있다. (드로잉 우선순위)
Strategy Pattern

    스트레트지 패턴으로 각 플랫폼 코드를 캡슐화한다.
                                               void Document::Draw(Painter* pPainter)

                    Painter                    {

                                               }
                                                 graphics_->Draw(pPainter);




                                               void Picture::Draw(Painter* pPainter)
                                               {
                                                 Iterator* iter = ...

WinPainter                        MacPainter   }
                                                 while(iter->HasObject())
                                                    iter->Draw(pPainter);




                                               void Rect::Draw(Painter* pPainter)
 void View::OnDraw(CDC* pDC)                   {
 {                                                pPainter->DrawRect(x_, y_, w_, h_);
   WinPainter aPainter(pDC);                   }
   pDocument_->Draw(&aPainter);
 }                                             void Text::Draw(Painter* pPainter)
                                               {
                                                  pPainter->DrawText(x_, y_, str_);
                                               }
Strategy Pattern 장단점.


가장 명확하고 쉬운 해결책.

컴포지트 패턴과 드로잉코드가 간접적으로 의존한다.

확장/유연성이 비지터패턴에 비해 상대적으로 부족하
다.

결론적으로 브릿지패턴과 유사형태를 가진다.
비지터 패턴

              비지터 패턴을 이용하여 드로잉한다.
                                                                       void Rect::Draw(Painter* pPainter)
                                                                       {
                               Painter                                 }
                                                                         pPainter->Draw(this);




                                                                       void Text::Draw(Painter* pPainter)
                                                                       {
                                                                         pPainter->Draw(this);

     WinPainter                        MacPainter                      }




void WinPainter::Draw(Rect* pRect)   void MacPainter::Draw(Rect* pRect) {
{                                    
    CGContextAddRect(context_, ...);
  pDC_->DrawRect(...);               
    CGContextStrokePath(context_);
}                                    }
void WinPainter::Draw(Text* pText)   void MacPainter::Draw(Text* pText) {
{                                    }
}
                                                                                                            - (void)drawRect:(CGRect)rect {
                                                                     void OnDraw(CDC* pDC)
                                                                                                              
   CGContextRef context =
                                                                     {
                                                                                                                 UIGraphicsGetCurrentContext();
                                                                       WinPainter aPainter(pDC);
                                                                                                                MacPainter aPainter(context);
                                                                       pDocument->Draw(&aPainter);
                                                                                                                pDocument->Draw(&aPainter);
                                                                     }
                                                                                                            }
비지터 패턴

              비지터 패턴을 이용하여 드로잉한다.
                                                                       void Rect::Draw(Painter* pPainter)
                                                                       {
                               Painter                                   pPainter->Draw(this);
                                                                       }
                                                                                                                   이중 디스패치
                                                                       void Text::Draw(Painter* pPainter)
                                                                       {
                                                                         pPainter->Draw(this);

     WinPainter                        MacPainter                      }




void WinPainter::Draw(Rect* pRect)   void MacPainter::Draw(Rect* pRect) {
{                                    
    CGContextAddRect(context_, ...);
  pDC_->DrawRect(...);               
    CGContextStrokePath(context_);
}                                    }
void WinPainter::Draw(Text* pText)   void MacPainter::Draw(Text* pText) {
{                                    }
}
                                                                                                            - (void)drawRect:(CGRect)rect {
                                                                     void OnDraw(CDC* pDC)
                                                                                                              
   CGContextRef context =
                                                                     {
                                                                                                                 UIGraphicsGetCurrentContext();
                                                                       WinPainter aPainter(pDC);
                                                                                                                MacPainter aPainter(context);
                                                                       pDocument->Draw(&aPainter);
                                                                                                                pDocument->Draw(&aPainter);
                                                                     }
                                                                                                            }
비지터 패턴


이해가 어렵다.

컴포지트 순회 방식과 뷰의 의존도를 끊을 수 있다.

컴포지트 패턴과 무관하게 추가 작업을 할 수 있다.
(드로잉 우선순위 조절)

하위 형변환을 직접적으로 하지 않는다.
컴포지트 패턴

컴포지트 패턴은 객체를 합성하여 동일한 메소드를 호
출할 수 있는 매력적인 장점을 가진다.

그러나, 상위 타입으로 객체를 저장하므로서 실행시점
의 하위타입을 찾기 위한 어려운 문제점에 봉착한다.

따라서,
객체 합성의 개수 제한이 없고,
객체 합성의 명확한 이점이 있을 경우에만 사용하는 것
이 좋다.

Weitere ähnliche Inhalte

Was ist angesagt?

프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기Jongwook Choi
 
C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부Gwangwhi Mah
 
25장 레거시코드활용전략 전반부 박진호
25장 레거시코드활용전략 전반부 박진호25장 레거시코드활용전략 전반부 박진호
25장 레거시코드활용전략 전반부 박진호jinho park
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2Chris Ohk
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)문익 장
 
Cpp 0x kimRyungee
Cpp 0x kimRyungeeCpp 0x kimRyungee
Cpp 0x kimRyungeescor7910
 
[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11흥배 최
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기jongho jeong
 
C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features SummaryChris Ohk
 
C++ Advanced 강의 4주차
 C++ Advanced 강의 4주차 C++ Advanced 강의 4주차
C++ Advanced 강의 4주차HyunJoon Park
 
Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Circulus
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Circulus
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++KWANGIL KIM
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
 

Was ist angesagt? (20)

프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
 
C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부
 
25장 레거시코드활용전략 전반부 박진호
25장 레거시코드활용전략 전반부 박진호25장 레거시코드활용전략 전반부 박진호
25장 레거시코드활용전략 전반부 박진호
 
C++11
C++11C++11
C++11
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2
 
WTL 소개
WTL 소개WTL 소개
WTL 소개
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
Cpp 0x kimRyungee
Cpp 0x kimRyungeeCpp 0x kimRyungee
Cpp 0x kimRyungee
 
[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
C++에서 Objective-C까지
C++에서 Objective-C까지C++에서 Objective-C까지
C++에서 Objective-C까지
 
C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features Summary
 
C++ Advanced 강의 4주차
 C++ Advanced 강의 4주차 C++ Advanced 강의 4주차
C++ Advanced 강의 4주차
 
Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체
 
6 function
6 function6 function
6 function
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
 
Boost
BoostBoost
Boost
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
 

Andere mochten auch

[2012 01 28]cleancode 1장
[2012 01 28]cleancode 1장[2012 01 28]cleancode 1장
[2012 01 28]cleancode 1장Jong Pil Won
 
Design patterns 스터디 -Decorator 패턴
Design patterns 스터디 -Decorator 패턴Design patterns 스터디 -Decorator 패턴
Design patterns 스터디 -Decorator 패턴Hyunho-Cho
 
Composite pattern
Composite patternComposite pattern
Composite pattern경 송
 
Decorator pattern
Decorator patternDecorator pattern
Decorator patternkidoki
 
Proxy, chain of responsibility, command pattern
Proxy, chain of responsibility, command patternProxy, chain of responsibility, command pattern
Proxy, chain of responsibility, command patternYoonJong Choi
 
Composite pattern
Composite patternComposite pattern
Composite patternkidoki
 
프로그래머라고 말할 수 있기까지
프로그래머라고 말할 수 있기까지프로그래머라고 말할 수 있기까지
프로그래머라고 말할 수 있기까지Hyun-Mook Choi
 
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4Daniel Lim
 
Ch10.애플리케이션 서버의 병목_발견_방법
Ch10.애플리케이션 서버의 병목_발견_방법Ch10.애플리케이션 서버의 병목_발견_방법
Ch10.애플리케이션 서버의 병목_발견_방법Minchul Jung
 
Oop design principle
Oop design principleOop design principle
Oop design principleRyan Park
 
파이썬+함수 데코레이터+이해하기 20160229
파이썬+함수 데코레이터+이해하기 20160229파이썬+함수 데코레이터+이해하기 20160229
파이썬+함수 데코레이터+이해하기 20160229Yong Joon Moon
 
람다아키텍처
람다아키텍처람다아키텍처
람다아키텍처HyeonSeok Choi
 
JVM과 톰캣 튜닝
JVM과 톰캣 튜닝JVM과 톰캣 튜닝
JVM과 톰캣 튜닝Mungyu Choi
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법hyun soomyung
 
Ch6 대용량서비스레퍼런스아키텍처 part.1
Ch6 대용량서비스레퍼런스아키텍처 part.1Ch6 대용량서비스레퍼런스아키텍처 part.1
Ch6 대용량서비스레퍼런스아키텍처 part.1Minchul Jung
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴예림 임
 
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제NAVER D2
 
대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴
대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴
대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴Terry Cho
 
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제NAVER D2
 

Andere mochten auch (20)

[2012 01 28]cleancode 1장
[2012 01 28]cleancode 1장[2012 01 28]cleancode 1장
[2012 01 28]cleancode 1장
 
Design patterns 스터디 -Decorator 패턴
Design patterns 스터디 -Decorator 패턴Design patterns 스터디 -Decorator 패턴
Design patterns 스터디 -Decorator 패턴
 
Composite pattern
Composite patternComposite pattern
Composite pattern
 
Decorator pattern
Decorator patternDecorator pattern
Decorator pattern
 
Proxy, chain of responsibility, command pattern
Proxy, chain of responsibility, command patternProxy, chain of responsibility, command pattern
Proxy, chain of responsibility, command pattern
 
Composite pattern
Composite patternComposite pattern
Composite pattern
 
프로그래머라고 말할 수 있기까지
프로그래머라고 말할 수 있기까지프로그래머라고 말할 수 있기까지
프로그래머라고 말할 수 있기까지
 
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4
 
Ch10.애플리케이션 서버의 병목_발견_방법
Ch10.애플리케이션 서버의 병목_발견_방법Ch10.애플리케이션 서버의 병목_발견_방법
Ch10.애플리케이션 서버의 병목_발견_방법
 
Oop design principle
Oop design principleOop design principle
Oop design principle
 
파이썬+함수 데코레이터+이해하기 20160229
파이썬+함수 데코레이터+이해하기 20160229파이썬+함수 데코레이터+이해하기 20160229
파이썬+함수 데코레이터+이해하기 20160229
 
Chean code chapter 1
Chean code chapter 1Chean code chapter 1
Chean code chapter 1
 
람다아키텍처
람다아키텍처람다아키텍처
람다아키텍처
 
JVM과 톰캣 튜닝
JVM과 톰캣 튜닝JVM과 톰캣 튜닝
JVM과 톰캣 튜닝
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법
 
Ch6 대용량서비스레퍼런스아키텍처 part.1
Ch6 대용량서비스레퍼런스아키텍처 part.1Ch6 대용량서비스레퍼런스아키텍처 part.1
Ch6 대용량서비스레퍼런스아키텍처 part.1
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴
 
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제
 
대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴
대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴
대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴
 
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제
 

Ähnlich wie Composite Pattern

C++ Advanced 강의 2주차
C++ Advanced 강의 2주차C++ Advanced 강의 2주차
C++ Advanced 강의 2주차HyunJoon Park
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성HyeonSeok Choi
 
Effective c++ item27
Effective c++ item27Effective c++ item27
Effective c++ item27진화 손
 
IndirectDraw with unity
IndirectDraw with unityIndirectDraw with unity
IndirectDraw with unityJung Suk Ko
 
GCGC- CGCII 서버 엔진에 적용된 기술 (1)
GCGC- CGCII 서버 엔진에 적용된 기술 (1)GCGC- CGCII 서버 엔진에 적용된 기술 (1)
GCGC- CGCII 서버 엔진에 적용된 기술 (1)상현 조
 
Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나병걸 윤
 
Deview 2019 눈발자국
Deview 2019 눈발자국Deview 2019 눈발자국
Deview 2019 눈발자국hanbeom Park
 

Ähnlich wie Composite Pattern (7)

C++ Advanced 강의 2주차
C++ Advanced 강의 2주차C++ Advanced 강의 2주차
C++ Advanced 강의 2주차
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
 
Effective c++ item27
Effective c++ item27Effective c++ item27
Effective c++ item27
 
IndirectDraw with unity
IndirectDraw with unityIndirectDraw with unity
IndirectDraw with unity
 
GCGC- CGCII 서버 엔진에 적용된 기술 (1)
GCGC- CGCII 서버 엔진에 적용된 기술 (1)GCGC- CGCII 서버 엔진에 적용된 기술 (1)
GCGC- CGCII 서버 엔진에 적용된 기술 (1)
 
Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나
 
Deview 2019 눈발자국
Deview 2019 눈발자국Deview 2019 눈발자국
Deview 2019 눈발자국
 

Mehr von Kyungryul KIM

전문검색기술도전
전문검색기술도전전문검색기술도전
전문검색기술도전Kyungryul KIM
 
Nib_NSWindowController
Nib_NSWindowControllerNib_NSWindowController
Nib_NSWindowControllerKyungryul KIM
 
서버인프라를지탱하는기술5 1 2
서버인프라를지탱하는기술5 1 2서버인프라를지탱하는기술5 1 2
서버인프라를지탱하는기술5 1 2Kyungryul KIM
 
Chaper24 languages high_and_low
Chaper24 languages high_and_lowChaper24 languages high_and_low
Chaper24 languages high_and_lowKyungryul KIM
 
Ch22 운영체제
Ch22 운영체제Ch22 운영체제
Ch22 운영체제Kyungryul KIM
 

Mehr von Kyungryul KIM (20)

Ch4 pugixml
Ch4 pugixmlCh4 pugixml
Ch4 pugixml
 
Node ch12
Node ch12Node ch12
Node ch12
 
11.scripting
11.scripting11.scripting
11.scripting
 
32 osx app_release
32 osx app_release32 osx app_release
32 osx app_release
 
Meteor ddp
Meteor ddpMeteor ddp
Meteor ddp
 
Cocos2dx 7.1-7.2
Cocos2dx 7.1-7.2Cocos2dx 7.1-7.2
Cocos2dx 7.1-7.2
 
Cocos2 d x-7.3_4
Cocos2 d x-7.3_4Cocos2 d x-7.3_4
Cocos2 d x-7.3_4
 
Cocos2d x-ch5-1
Cocos2d x-ch5-1Cocos2d x-ch5-1
Cocos2d x-ch5-1
 
Coco2d x
Coco2d xCoco2d x
Coco2d x
 
23 drag drop
23 drag drop23 drag drop
23 drag drop
 
Hadoop ch5
Hadoop ch5Hadoop ch5
Hadoop ch5
 
전문검색기술도전
전문검색기술도전전문검색기술도전
전문검색기술도전
 
Nib_NSWindowController
Nib_NSWindowControllerNib_NSWindowController
Nib_NSWindowController
 
Dsas
DsasDsas
Dsas
 
서버인프라를지탱하는기술5 1 2
서버인프라를지탱하는기술5 1 2서버인프라를지탱하는기술5 1 2
서버인프라를지탱하는기술5 1 2
 
Chaper24 languages high_and_low
Chaper24 languages high_and_lowChaper24 languages high_and_low
Chaper24 languages high_and_low
 
Ch22 운영체제
Ch22 운영체제Ch22 운영체제
Ch22 운영체제
 
Mibis ch20
Mibis ch20Mibis ch20
Mibis ch20
 
Mibis ch15
Mibis ch15Mibis ch15
Mibis ch15
 
Mibis ch8
Mibis ch8Mibis ch8
Mibis ch8
 

Composite Pattern

  • 1. 컴포지트 패턴 (Composite Pattern) 멀티플랫폼 지원관점에서... - MindHD 사례
  • 2. 컴포지트 패턴 컴포지트 패턴는 각각의 객체를 복 합객체로 만든다. 드로잉 객체를 복합하여 관리하기 위해 컴포지트 패턴을 이용한다. 이미지(돋보기, 포스트잇), 텍스트 인스턴스를 조합할 수 있다.
  • 4. 컴포지트 패턴 메소드 호출 컴포지트 패턴의 메소드 호출은 복합객체에서 단말객체로 단방향 호출이 이루어진다. void Document::Draw(Painter* pPainter) { void View::OnDraw(CDC* pDC) graphics_->Draw(pPainter); { } WinPainter aPainter(pDC); pDocument_->Draw(&aPainter); } void Picture::Draw(Painter* pPainter) { Iterator* iter = ... while(iter->HasObject()) iter->Draw(pPainter); } void Rect::Draw(Painter* pPainter) { // draw rect } void Text::Draw(Painter* pPainter) { // draw text }
  • 5. 컴포지트 패턴 메소드 호출 컴포지트 패턴의 메소드 호출은 복합객체에서 단말객체로 단방향 호출이 이루어진다. void Document::Draw(Painter* pPainter) { void View::OnDraw(CDC* pDC) graphics_->Draw(pPainter); { } WinPainter aPainter(pDC); pDocument_->Draw(&aPainter); } void Picture::Draw(Painter* pPainter) { Iterator* iter = ... while(iter->HasObject()) iter->Draw(pPainter); } void Rect::Draw(Painter* pPainter) { // draw rect } 멀티플랫폼 지원 void Text::Draw(Painter* pPainter) { // draw text }
  • 6. 조건부 컴파일 조건부 컴파일로 어느 정도 해결. 지원 객체와 플랫폼이 늘어나면 관리 이슈 발생함. OOP적 해결방식은?
  • 7. 플랫폼별 상속 각 객체를 상속받은 Draw() 메소드에서 플랫폼별로 드로 잉 작업을 수행한다. Rect Text WinRect WinText MacRect MacText void MacRect::Draw(Painter* pPainter) { void WinRect::Draw(Painter* pPainter) CGContextRef context = pPainter->Context(); { CGContextAddRect(context, rect); CDC* pDC = pPainter->Context(); CGContextStrokePath(context); pDC->DrawRect(...); } }
  • 8. 각 플랫폼별 상속 장단점 플랫폼별 하위 클래스를 생성해야 한다. 객체 또는 플랫폼이 늘어나는 경우 대처가 힘들다. 파일 단위로 구분한 경우 파일 관리가 힘들 수 있다. 파일 단위 구분은 작업 단위가 명확할 수 있는 장점. Abstract Factory 패턴과 연동.
  • 9. 이터레이터 패턴 각 플랫폼별 뷰에서 개체를 순회하며 드로잉한다. Iterator class Iterator { public: Iterator(); virtual ~Iterator(); virtual const Glyph* Next() const = 0; virtual bool HasNext() const = 0; CompositeIterator }; void View::OnDraw(CDC* pDC) - (void)drawRect:(CGRect)rect { { CGContextRef context = UIGraphicsGetCurrentContext(); Iterator* iter = pDocument_->CreateIterator(); Iterator* iter = pDocument_->CreateIterator(); while(!iter->HasNext()) while(!iter->HasNext()) { { Rect* r = dynamic_cast<Rect*>((*iter)->Object()); Rect* r = dynamic_cast<Rect*>((*iter)->Object()); pDC->DrawRect(...); CGContextAddRect(context, r->Rect()); pDC->DrawText(...); DrawText(context,...); iter->Next(); iter->Next(); } } } }
  • 10. 이터레이터 패턴 단순 명확하다.(이터레이터 패턴 추가 제외) 뷰는 컴포지트 패턴에 의존한다. 컴포지트 패턴 변경시 각 플랫폼별 뷰 (드로잉)을 변경해야 한다. 뷰에서 하위 형변환이 발생한다. 유연/확장성이 떨어질 수 있다. (드로잉 우선순위)
  • 11. Strategy Pattern 스트레트지 패턴으로 각 플랫폼 코드를 캡슐화한다. void Document::Draw(Painter* pPainter) Painter { } graphics_->Draw(pPainter); void Picture::Draw(Painter* pPainter) { Iterator* iter = ... WinPainter MacPainter } while(iter->HasObject()) iter->Draw(pPainter); void Rect::Draw(Painter* pPainter) void View::OnDraw(CDC* pDC) { { pPainter->DrawRect(x_, y_, w_, h_); WinPainter aPainter(pDC); } pDocument_->Draw(&aPainter); } void Text::Draw(Painter* pPainter) { pPainter->DrawText(x_, y_, str_); }
  • 12. Strategy Pattern 장단점. 가장 명확하고 쉬운 해결책. 컴포지트 패턴과 드로잉코드가 간접적으로 의존한다. 확장/유연성이 비지터패턴에 비해 상대적으로 부족하 다. 결론적으로 브릿지패턴과 유사형태를 가진다.
  • 13. 비지터 패턴 비지터 패턴을 이용하여 드로잉한다. void Rect::Draw(Painter* pPainter) { Painter } pPainter->Draw(this); void Text::Draw(Painter* pPainter) { pPainter->Draw(this); WinPainter MacPainter } void WinPainter::Draw(Rect* pRect) void MacPainter::Draw(Rect* pRect) { { CGContextAddRect(context_, ...); pDC_->DrawRect(...); CGContextStrokePath(context_); } } void WinPainter::Draw(Text* pText) void MacPainter::Draw(Text* pText) { { } } - (void)drawRect:(CGRect)rect { void OnDraw(CDC* pDC) CGContextRef context = { UIGraphicsGetCurrentContext(); WinPainter aPainter(pDC); MacPainter aPainter(context); pDocument->Draw(&aPainter); pDocument->Draw(&aPainter); } }
  • 14. 비지터 패턴 비지터 패턴을 이용하여 드로잉한다. void Rect::Draw(Painter* pPainter) { Painter pPainter->Draw(this); } 이중 디스패치 void Text::Draw(Painter* pPainter) { pPainter->Draw(this); WinPainter MacPainter } void WinPainter::Draw(Rect* pRect) void MacPainter::Draw(Rect* pRect) { { CGContextAddRect(context_, ...); pDC_->DrawRect(...); CGContextStrokePath(context_); } } void WinPainter::Draw(Text* pText) void MacPainter::Draw(Text* pText) { { } } - (void)drawRect:(CGRect)rect { void OnDraw(CDC* pDC) CGContextRef context = { UIGraphicsGetCurrentContext(); WinPainter aPainter(pDC); MacPainter aPainter(context); pDocument->Draw(&aPainter); pDocument->Draw(&aPainter); } }
  • 15. 비지터 패턴 이해가 어렵다. 컴포지트 순회 방식과 뷰의 의존도를 끊을 수 있다. 컴포지트 패턴과 무관하게 추가 작업을 할 수 있다. (드로잉 우선순위 조절) 하위 형변환을 직접적으로 하지 않는다.
  • 16. 컴포지트 패턴 컴포지트 패턴은 객체를 합성하여 동일한 메소드를 호 출할 수 있는 매력적인 장점을 가진다. 그러나, 상위 타입으로 객체를 저장하므로서 실행시점 의 하위타입을 찾기 위한 어려운 문제점에 봉착한다. 따라서, 객체 합성의 개수 제한이 없고, 객체 합성의 명확한 이점이 있을 경우에만 사용하는 것 이 좋다.

Hinweis der Redaktion

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n