당신은 주제를 찾고 있습니까 “컴포지트 패턴 – 디자인패턴, Composite Pattern, 콤포짓 콤포지트 패턴“? 다음 카테고리의 웹사이트 https://you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.maxfit.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 코드없는 프로그래밍 이(가) 작성한 기사에는 조회수 1,798회 및 좋아요 57개 개의 좋아요가 있습니다.
컴포지트 패턴(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
컴포지트 패턴 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 디자인패턴, Composite Pattern, 콤포짓 콤포지트 패턴 – 컴포지트 패턴 주제에 대한 세부정보를 참조하세요
유료강의: https://www.youtube.com/channel/UCHcG02L6TSS-StkSbqVy6Fg/join
챕터List : https://www.youtube.com/playlist?list=PLDV-cCQnUlIaOFXCUv8vEMGxqzrrkGv_P
Code: https://colab.research.google.com/github/NoCodeProgram/DesignPatterns/blob/main/Structural/compositeP.ipynb
컴포지트 패턴 주제에 대한 자세한 내용은 여기를 참조하세요.
컴포지트 패턴(Composite Pattern) :: 마이구미
컴포지트 패턴은 클라이언트가 복합 객체(group of object) 나 단일 객체를 동일하게 취급하는 것을 목적으로 한다. 여기서 컴포지트의 의도는 트리 …
Source: mygumi.tistory.com
Date Published: 8/12/2021
View: 3642
[디자인 패턴 7편] 구조 패턴, 컴퍼지트(Composite)
1. 개념 컴퍼지트 패턴은 단일 객체와 그 객체들을 가지는 집합 객체를 같은 타입으로 취급하며, 트리 구조로 객체들을 엮는 패턴이다. 1.1.
Source: dailyheumsi.tistory.com
Date Published: 3/1/2022
View: 2356
컴포지트 패턴 – 제타위키
1 개요[ | ]. composite pattern; 컴포지트 패턴, 복합체 패턴. “그릇과 내용물을 동일시하기”; 객체들의 관계를 트리 구조로 구성하여 부분-전체 …
Source: zetawiki.com
Date Published: 2/12/2021
View: 2651
[디자인 패턴] 컴포지트 패턴 – 개발은 꽃
컴포지트 패턴은 클라이언트가 복합 객체나 단일 객체를 동일하게 취급하는 것을 목적으로 한다. 여기서 컴포지트의 의도는 트리 구조로 작성하여 …
Source: it-mesung.tistory.com
Date Published: 12/13/2022
View: 1985
[GoF Design Patterns] 디자인 패턴을 알아보자! (8) Composite
컴포지트 패턴은 객체들의 관계를 트리구조로 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체를 모두 동일하게 다룰수 있도록 구조화한 패턴이다 …
Source: www.jiniaslog.co.kr
Date Published: 4/11/2021
View: 4886
[구조 패턴] 복합체 패턴(Composite Pattern) 이해 및 예제
Composite 패턴은 구조 패턴 중 하나로, 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴입니다. 사용자는 이 복합체 패턴을 …
Source: readystory.tistory.com
Date Published: 5/29/2021
View: 395
[디자인패턴] 컴포지트 패턴 – 붕어사랑 티스토리
컴포지트 패턴(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 …
Source: lucky516.tistory.com
Date Published: 2/17/2022
View: 132
주제와 관련된 이미지 컴포지트 패턴
주제와 관련된 더 많은 사진을 참조하십시오 디자인패턴, Composite Pattern, 콤포짓 콤포지트 패턴. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
![디자인패턴, Composite Pattern, 콤포짓 콤포지트 패턴](https://i.ytimg.com/vi/XXvrHAsfTso/maxresdefault.jpg)
주제에 대한 기사 평가 컴포지트 패턴
- Author: 코드없는 프로그래밍
- Views: 조회수 1,798회
- Likes: 좋아요 57개
- Date Published: 2021. 10. 28.
- Video Url link: https://www.youtube.com/watch?v=XXvrHAsfTso
위키백과, 우리 모두의 백과사전
컴포지트 패턴(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
구조 [ 편집 ]
예 [ 편집 ]
자바 [ 편집 ]
import java.util.List ; import java.util.ArrayList ; /** “Component” */ interface Graphic { //Prints the graphic. public void print (); } /** “Composite” */ class CompositeGraphic implements Graphic { //Collection of child graphics. private List < Graphic > mChildGraphics = new ArrayList < Graphic > (); //Prints the graphic. public void print () { for ( Graphic graphic : mChildGraphics ) { graphic . print (); } } //Adds the graphic to the composition. public void add ( Graphic graphic ) { mChildGraphics . add ( graphic ); } //Removes the graphic from the composition. public void remove ( Graphic graphic ) { mChildGraphics . remove ( graphic ); } } /** “Leaf” */ class Ellipse implements Graphic { //Prints the graphic. public void print () { System . out . println ( “Ellipse” ); } } /** Client */ public class Program { public static void main ( String [] args ) { //Initialize four ellipses Ellipse ellipse1 = new Ellipse (); Ellipse ellipse2 = new Ellipse (); Ellipse ellipse3 = new Ellipse (); Ellipse ellipse4 = new Ellipse (); //Initialize three composite graphics CompositeGraphic graphic = new CompositeGraphic (); CompositeGraphic graphic1 = new CompositeGraphic (); CompositeGraphic graphic2 = new CompositeGraphic (); //Composes the graphics graphic1 . add ( ellipse1 ); graphic1 . add ( ellipse2 ); graphic1 . add ( ellipse3 ); graphic2 . add ( ellipse4 ); graphic . add ( graphic1 ); graphic . add ( graphic2 ); //Prints the complete graphic (four times the string “Ellipse”). graphic . print (); } }
출력 결과 Container 1: 0 1 Container 2: 2 3 4
#include
#include #include using std :: cout ; using std :: vector ; using std :: string ; class Component { public : virtual void list () const = 0 ; virtual ~ Component (){}; }; class Leaf : public Component { public : explicit Leaf ( int val ) : value_ ( val ) { } void list () const { cout << " " << value_ << " " ; } private : int value_ ; }; class Composite : public Component { public : explicit Composite ( string id ) : id_ ( id ) { } void add ( Component * obj ) { table_ . push_back ( obj ); } void list () const { cout << id_ << ":" << " " ; for ( vector < Component *>:: const_iterator it = table_ . begin (); it != table_ . end (); ++ it ) { ( * it ) -> list (); } } private : vector < Component *> table_ ; string id_ ; }; int main () { Leaf num0 ( 0 ); Leaf num1 ( 1 ); Leaf num2 ( 2 ); Leaf num3 ( 3 ); Leaf num4 ( 4 ); Composite container1 ( “Container 1” ); Composite container2 ( “Container 2” ); container1 . add ( & num0 ); container1 . add ( & num1 ); container2 . add ( & num2 ); container2 . add ( & num3 ); container2 . add ( & num4 ); container1 . add ( & container2 ); container1 . list (); return 0 ; } Python3 [ 편집 ]
컴포지트 패턴(Composite Pattern) :: 마이구미
반응형
이 글은 디자인 패턴 중 컴포지트 패턴(Composite Pattern) 을 다룬다. 위키피디아의 내용을 기반으로 정리할 예정이다. 위키 – https://en.wikipedia.org/wiki/Composite_pattern
글의 주제를 다루기에 앞서, 글들을 참고하면서, 기억에 남는 문장은 다음과 같다.
It suggests that design patterns aren’t things we invent. They’re things we discover.
디자인 패턴은 누군가 발명한 것이 아닌, 발견했다고, 생각하면 조금 더 편하게 바라볼 수 있지 않을까 생각한다.
컴포지트(Composite) 란?
OOP 에서 컴포지트(Composite) 는 하나 이상의 유사한 객체를 구성으로 설계된 객체로 모두 유사한 기능을 나타낸다.
이를 통해 객체 그룹을 조작하는 것처럼, 단일 객체를 조작할 수 있다.
컴포지트 패턴은 무엇인가?
컴포지트 패턴은 클라이언트가 복합 객체(group of object) 나 단일 객체를 동일하게 취급하는 것을 목적으로 한다.
여기서 컴포지트의 의도는 트리 구조로 작성하여, 전체-부분(whole-part) 관계를 표현하는 것이다.
트리 구조를 다룰 때, 프로그래머는 리프 노드와 브랜치를 구별해야한다.
여기서 코드는 많은 복잡성을 만들어 많은 에러를 초래한다.
이를 해결하기 위해, 복잡하고 원시적인 객체를 동일하게 취급하기 위한 인터페이스를 작성할 수 있다.
결과적으로 컴포지트 패턴은 인터페이스와 본연의 컴포지트의 개념을 활용한다.
컴포지트 패턴은 언제 사용하는가?
복합 객체와 단일 객체의 처리 방법이 다르지 않을 경우, 전체-부분 관계로 정의할 수 있다.
전체-부분 관계의 대표적인 예는 Directory-File 이 존재한다.
이러한 전체-부분 관계를 효율적으로 정의할 때 유용하다.
전체-부분 관계를 트리 구조로 표현하고 싶을 경우.
전체-부분 관계를 클라이언트에서 부분, 관계 객체를 균일하게 처리하고 싶을 경우.
UML 다이어그램이 뜻하는 의미는 다음과 같다.
“Client” 클래스는 “Leaf” 와 “Composite” 클래스를 직접 참조하지 않고, 공통 인터페이스 “Component” 를 참조하는 것을 볼 수 있다.
“Leaf” 클래스는 “Component” 인터페이스를 구현한다.
“Composite” 클래스는 “Component” 객체 자식들을 유지하고, operation() 과 같은 요청을 통해 자식들에게 전달한다.
각각을 조금 더 코드 관점에서 보면 다음과 같다.
Component
모든 component 들을 위한 추상화된 개념으로써, “Leaf” 와 “Composite” 클래스의 인터페이스이다.
Leaf
“Component” 인터페이스를 구현하고, 구체 클래스를 나타낸다.
Composite
“Component” 인터페이스를 구현하고, 구현되는 자식(Leaf or Composite) 들을 가지고, 이러한 자식들을 관리하기 위한 메소드(addChild, removeChild…)를 구현한다.
또한, 일반적으로 인터페이스에 작성된 메소드는 자식에게 위임하는 처리를 한다.
* Composite.operation() => Leaf.operation(), 자세한 이해는 아래 예제를 통해 할 수 있다.
이를 기반으로, 객체 다이어그램을 보면 이해하기 쉽다.
“Client” 에서 트리 구조에서의 top-level 에 존재하는 “Composite1” 에 요청을 보낸다.
그러면 “Component” 인터페이스를 구현한 객체들은 트리 구조를 토대로 위에서 아래 방향으로 모든 자식 요소에게 전달하게 된다.
이것은 실제로 런타임에서 일어나는 행위라고 보면 된다.
예제 코드를 접목해보자.
예제 코드는 원, 삼각형, 사각형 등과 같은 형태의 그래픽을 주제로 한다.
/** “Component” */ interface Graphic { //Prints the graphic. public void print (); }
“Component” 에 해당하는 인터페이스 “Graphic” 를 나타낸다.
이를 구현하는 클래스들이 동일한 처리를 하는 메소드로 “무엇인가를 출력하는 행위” 를 작성했다.
/** “Leaf” */ class Ellipse implements Graphic { //Prints the graphic. public void print () { System . out . println ( “Ellipse” ); } }
“Leaf” 에 해당하는 구체 클래스 중 하나로 표현할 수 있는 “Ellipse” 라는 클래스를 만들었다.
그리고 인터페이스에 작성된 메소드인 print() 를 오버라이딩했다.
/** “Composite” */ class CompositeGraphic implements Graphic { //Collection of child graphics. private List < Graphic > childGraphics = new ArrayList < Graphic >(); //Prints the graphic. public void print () { for ( Graphic graphic : childGraphics ) { graphic . print (); //Delegation } } //Adds the graphic to the composition. public void add ( Graphic graphic ) { childGraphics . add ( graphic ); } //Removes the graphic from the composition. public void remove ( Graphic graphic ) { childGraphics . remove ( graphic ); } }
“Composite” 에 해당하는 클래스로, “Component” 에 해당하는 인터페이스 “Graphic” 를 구현하는 요소들을 관리하기 위한 리스트가 존재한다.
그리고 이를 위한 추가적인 메소드 add, remove 가 존재하고, 인터페이스에서 작성된 메소드인 print() 를 오버라이딩 해주었다.
여기서 print() 는 위에서 언급한 “Composite” 가 일반적으로 하는 작성되는 형태로써, 자식들에게 요청을 위임하는 처리를 하게 된다.
/** Client */ public class Program { public static void main(String[] args) { //Initialize four ellipses Ellipse ellipse1 = new Ellipse(); Ellipse ellipse2 = new Ellipse(); Ellipse ellipse3 = new Ellipse(); Ellipse ellipse4 = new Ellipse(); //Initialize three composite graphics CompositeGraphic graphic = new CompositeGraphic(); CompositeGraphic graphic1 = new CompositeGraphic(); CompositeGraphic graphic2 = new CompositeGraphic(); //Composes the graphics graphic1.add(ellipse1); // children – leaf graphic1.add(ellipse2); // children – leaf graphic1.add(ellipse3); // children – leaf graphic2.add(ellipse4); // children – leaf graphic.add(graphic1); // children – composite graphic.add(graphic2); // children – composite //Prints the complete graphic (Four times the string “Ellipse”). graphic.print(); } }
“Client” 에서는 “Composite” 는 자식을 관리하기 위한 추가적인 메소드인 add() 를 통해 자식으로 여러 개의 “Leaf” 를 가질 수 있다.
또한, “Composite” 에 해당하는 또 다른 인스턴스를 자식으로 가질 수 있는 모습을 볼 수 있다.
결과적으로, 트리 구조가 만들어지면서, print() 와 같이 단일 객체와 복합 객체가 같은 방법으로 처리되는 형태가 만들어진다.
이것이 일반적으로 알려진 컴포지트 패턴에 대한 이야기이다.
더 나아가, 2가지 형태의 방식으로 나눌 수 있다.
컴포지트 패턴에서 “Composite” 클래스는 자식들을 관리하기 위해 추가적인 메소드가 필요하다고 언급했다.
이러한 메소드들이 어떻게 작성되느냐에 따라, 컴포지트 패턴은 다른 목적을 추구할 수 있다.
지금까지 다룬 방식은 타입의 안정성을 추구하는 방식이다.
이것은 자식을 다루는 add(), remove() 와 같은 메소드들은 오직 “Composite” 만 정의되었다.
그로 인해, “Client” 는 “Leaf” 와 “Composite” 를 다르게 취급하고 있다.
하지만 “Client” 에서 “Leaf” 객체가 자식을 다루는 메소드를 호출할 수 없기 때문에, 타입에 대한 안정성을 얻게 된다.
Ellipse ellipse = new Ellipse(); CompositeGraphic graphic = new CompositeGraphic();
다른 방식으로 일관성을 추구하는 방식은, 자식을 다루는 메소드들을 “Composite” 가 아닌 “Component” 에 정의한다.
그로 인해, “Client” 는 “Leaf” 와 “Composite” 를 일관되게 취급할 수 있다.
하지만 “Client” 는 “Leaf” 객체가 자식을 다루는 메소드를 호출할 수 있기 때문에, 타입의 안정성을 잃게 된다.
Graphic ellipse = new Ellipse(); Graphic graphic = new CompositeGraphic();
어떤 방식이 더 좋냐를 따지기에는 너무 많은 것이 고려된다.
위키에서의 이론은 컴포지트 패턴은 타입의 안정성보다는 일관성을 더 강조한다고 한다.
반응형
[디자인 패턴 7편] 구조 패턴, 컴퍼지트(Composite)
1. 개념
컴퍼지트 패턴은 단일 객체와 그 객체들을 가지는 집합 객체를
같은 타입으로 취급하며, 트리 구조로 객체들을 엮는 패턴이다.
1.1. 장점
객체들이 모두 같은 타입으로 취급되기 때문에 새로운 클래스 추가가 용이하다.
단일객체, 집합객체 구분하지 않고 코드 작성이 가능하다.
1.2. 단점
설계를 일반화 시켜 객체간의 구분, 제약이 힘들다.
1.3. 활용 상황
객체들 간에 계급 및 계층구조가 있고 이를 표현해야할 때
클라이언트가 단일 객체와 집합 객체를 구분하지 않고 동일한 형태로 사용하고자 할 때
2. 구조
https://ko.wikipedia.org/wiki/컴포지트_패턴
Component Leaf와 Composite 가 구현해야하는 Interface 로, Leaf 와 Composite 는 모두 Component 라는 같은 타입으로 다뤄진다.
Leaf 단일 객체로 Composite 의 부분(자식) 객체로 들어가게 된다.
이 때, Component 의 형태로 들어간다.
Composite 집합 객체로 Leaf 객체나 Composite 를 부분(자식)으로 둔다.
이 때, Component 의 형태로 들어간다. 클라이언트는 이 Composite 를 통해 부분 객체들 (Leaf 나 Composite) 을 다룰 수 있다.
3. 구현
개인적으로 아래 두 포스팅이 제일 잘 정리되어 있어 링크만 남긴다.
순서대로 읽어보면 좋을 것 같다.
특히 첫 번째 포스팅의 File – Directory 구조를 떠올려 보면 쉽게 이해가 간다.
가장 핵심이 되는 부분은 Component 인터페이스를 정의하고, Leaf 와 Composite 가 이를 구현하는 것이다. 두 클래스가 동등하게 다뤄지는 핵심적인 이유이다.
4. 참고
반응형
[디자인 패턴] 컴포지트 패턴
반응형
컴포지트 패턴을 통해 트리 구조를 구현할 수 있다.
컴포지트란
하나 이상의 유사한 객체를 구성으로 설계된 객체로 모두 유사한 기능을 나타낸다. 이를 통해 객체 그룹을 조작하는 것처럼 단일 객체를 조작할 수 있다.
컴포지트 패턴이란?
컴포지트 패턴은 클라이언트가 복합 객체나 단일 객체를 동일하게 취급하는 것을 목적으로 한다. 여기서 컴포지트의 의도는 트리 구조로 작성하여 전체-부분 관계를 표현하는 것이다.
컴포지트 패턴은 언제 사용하는가?
복합 객체와 단일 객체의 처리 방법이 다르지 않을 경우, 전체-부분 관계로 정의할 수 있다.
기본 설계
Component : 모든 표현할 요소들의 추상적인 인터페이스이다.
Leaf : Component 인터페이스를 구현하고 구현체 클래스를 나타낸다. ( 단일 객체에 해당된다. )
) Composite : Component 인터페이스를 구현하고, 구현되는 자식들을 가지고 관리하기 위한 메소드(addChild, removeChild..)를 구현한다. 또한, 일반적으로 인터페이스에 작성된 메소드는 자식에게 위임하는 처리를 한다. (복합 객체에 해당된다.)
예제 코드
소스를 통해 살펴보자
//구현을 공유해야할 필요가 있으면 추상클래스, 공유할 필요가 없으면 인터페이스 abstract public class Component { private String name; public Component(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } //Leaf public class File extends Component{ private Object data; public File(String name) { super(name); } public Object getData() { return data; } public void setData(Object data) { this.data = data; } } //Composite public class Folder extends Component { List
children = new ArrayList<>(); public Folder(String name) { super(name); } public boolean addComponent(Component component) { return children.add(component); } public boolean removeComponent(Component component) { return children.remove(component); } public List getChildren() { return children; } public void setChildren(List children) { this.children = children; } } //Main public static void main(String[] args) { Folder root = new Folder(“root”), home = new Folder(“home”), mesung = new Folder(“mesung”), music = new Folder(“music”), picture = new Folder(“picture”), doc = new Folder(“doc”), usr = new Folder(“usr”); File track1 = new File(“track1”), track2 = new File(“track2”), pic1 = new File(“pic1”), doc1 = new File(“doc1”), java = new File(“java”); root.addComponent(home); home.addComponent(mesung); mesung.addComponent(music); music.addComponent(track1); music.addComponent(track2); mesung.addComponent(picture); picture.addComponent(pic1); mesung.addComponent(doc); doc.addComponent(doc1); root.addComponent(usr); usr.addComponent(java); show(root); } //print private static void show(Component component) { System.out.println(component.getClass().getName()+”|”+component.getName()); if(component instanceof Folder) { for(Component c : ((Folder)component).getChildren()) { show(c); } } } //실행 결과 com.pattern.ch10_composite.Folder|root com.pattern.ch10_composite.Folder|home com.pattern.ch10_composite.Folder|mesung com.pattern.ch10_composite.Folder|music com.pattern.ch10_composite.File|track1 com.pattern.ch10_composite.File|track2 com.pattern.ch10_composite.Folder|picture com.pattern.ch10_composite.File|pic1 com.pattern.ch10_composite.Folder|doc com.pattern.ch10_composite.File|doc1 com.pattern.ch10_composite.Folder|usr com.pattern.ch10_composite.File|java 반응형
[GoF Design Patterns] 디자인 패턴을 알아보자! (8) Composite
Composite 란?
컴포지트 패턴의 정의, Intend
컴포지트 패턴은 객체들의 관계를 트리구조로 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체를 모두 동일하게 다룰수 있도록 구조화한 패턴이다.
Composition?
컴포지션은 패턴이라기보다는 설계 개념, 컨셉으로서 하나의 객체가 다른 객체를 품고있는 경우를 일반적으로 말한다.
여기서 조금 더 나아가, 컴포지션의 가장 밖에 위치한 객체 = Wrapper 객체는 내부에 품고있는 객체와 생명주기가 강결합되어있는편이다.
What is Composition over Inheritance
자바나 OOP에 대해 공부하다보면 어느순간 상속보다는 결합( composition )을 사용하라는 말을 듣게된다. 나 역시 이펙티브 자바, Object 등을 공부하면서 해당 구문을 읽었고, 이번에 컴포지트 패턴을 공부하면서도 듣게 되었다.
해당 내용은 다형성의 구현에 있어서 상속은 부모클래스가 구현하는 내용을 자식 클래스가 모두 물려받다보니, 하위클래스에서 정작 쓰이지 않는 메서드도 갖게되고, 부모클래스의 변화에 따라 자식클래스도 크게 영향을 받게되므로
캡슐화가 깨지게 된다는 주장이였다.
따라서 is-a 관계인경우에만 상속을 사용하고, 보통은 객체간 결합을 사용해야하며 많은 공감을 받아 현재 OOP 진형의 대표적인 설계기법으로 자리 잡고 있다.
Composition vs Composite pattern?
인터넷의 여러 글을 읽어보고 의문점이 들었는데 컴포지트 패턴은 명확하게 의도가
복잡하게 얽혀있는 데이터 구조를 트리 구조로 하이라이키하게 계층화시키고, 이러한 구조의 노드와 리프들을 모두 같은 인터페이스로 접근하도록 하려는 패턴
인거지, 상속의 한계와 그 해결책으로 나온 패턴이 아니라는 점이다.
이펙티브 자바나 Object책에서 소개된 Composition 으로서의 패턴도 Decorator 패턴이지, 컴포지트 패턴이랑은 거리가 멀었다.
몇몇 블로그글도 그렇고 나 역시도 컴포지트 패턴이 컴포지션-상속 논쟁 의 컴포지션으로 생각했었는데
컴포지트 패턴이 컴포지션의 구조인건 맞지만 그 의도가 위의 내용이랑은 전혀 관계가 없다는걸 깨달았다.
아마도 명칭의 유사성때문에 헤깔리지 않았나 싶은데 이참에 개념을 다시 잡았다.
요약하자면 컴포지트 패턴은 Compositon over Inheritance 와는 전혀 관련이 없다!
혹시 이견이 있다면 꼭 댓글로 달아주시길
왜 필요한가? Pros
데이터를 다루다보면 계층형 트리 자료구조로 저장되고 이를 다루게되는 경우가 종종 생긴다.
이때 composite패턴을 사용하면 클라이언트측에서 모든 데이터를 모르더라도 복잡한 트리구조를 쉽게 다룰수 있다.
새로운 leaf 로서의 클래스를 추가하더라도 클라이언트는 상위 추상화된 인터페이스만을 바라보기 때문에, OCP 를 준수할 수 있다.
문제점은? Cons
계층형 구조에서 leaf 에 해당하는 객체와 Node 에 해당하는 객체들 모두를 동일한 인터페이스로 다루어야하는데, 이 인터페이스 설계가 어려울 수 있다. 이럴때는 디자인패턴에 억지로 끼워맞추려는것은 아닌지 다시 생각해볼필요가 있다.
구현 코드
public interface Document { void delete(); } public class Folder implements Document { private List
contents = new ArrayList<>(); @Override public void delete() { for (Document content : contents) { content.delete(); } } public void addContents(Document content){ contents.add(content); } } public class File implements Document { private String contents; public File(String contents) { this.contents = contents; } @Override public void delete() { System.out.println(“delete contents : ” + contents); } } 설명
최상위 Document 인터페이스가 있고 이를 상속받는 폴더와 파일이 있는 단순한 자료구조를 구현했다.
폴더에는 파일이나 폴더가 담길수 있기때문에 트리구조로 자료가 담기게 되는데, 이때 최상위 root 폴더에 delete() 메서드만 호출하면 재귀적으로 모든 파일들이 다 delete() 메서드를 호출하게되는 구조다.
private static Document buildDocu() { Folder root = new Folder(); Folder subNode1 = new Folder(); Folder subNode2 = new Folder(); root.addContents(subNode1); root.addContents(subNode2); subNode1.addContents(new File(“컨텐츠1”)); subNode1.addContents(new File(“컨텐츠2”)); subNode1.addContents(new File(“컨텐츠3”)); subNode2.addContents(new File(“컨텐츠4”)); Folder subNode3 = new Folder(); subNode2.addContents(subNode3); subNode3.addContents(new File(“컨텐츠5”)); return root; }
위와같은 파일이 주어졌을때 클라이언트 측에서 아래처럼 호출하면
public static void main(String[] args) { Document document = buildDocu(); document.delete(); } //delete contents : 컨텐츠1 //delete contents : 컨텐츠2 //delete contents : 컨텐츠3 //delete contents : 컨텐츠4 //delete contents : 컨텐츠5
트리구조를 손쉽게 다룰수 있게된다.
다른패턴과의 관계
재귀적인 구조를 만들때 Builder패턴을 사용하면 훨씬 가독성이 좋아진다
iterator 패턴이나 visitor 패턴을 composite 패턴 트리에 작동되도록 할수도 있다
leaf노드에 경량패턴을 적용하여 램사용을 줄일수있다.
decorator 패턴과 유사한 구조를 보이는데, decorator 패턴은 래퍼 객체가 추가적인 책임을 갖는다는 점에서 큰 차이가 있다.
References
[구조 패턴] 복합체 패턴(Composite Pattern) 이해 및 예제
반응형
Composite 패턴은 구조 패턴 중 하나로, 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴입니다. 사용자는 이 복합체 패턴을 통해 단일 객체와 복합 객체 모두 동일하게 다룰 수 있습니다.
구조 패턴(Structural Pattern)이란?
구조 패턴이란 작은 클래스들을 상속과 합성을 이용하여 더 큰 클래스를 생성하는 방법을 제공하는 패턴입니다.
이 패턴을 사용하면 서로 독립적으로 개발한 클래스 라이브러리를 마치 하나인 양 사용할 수 있습니다. 또, 여러 인터페이스를 합성(Composite)하여 서로 다른 인터페이스들의 통일된 추상을 제공합니다.
구조 패턴의 중요한 포인트는 인터페이스나 구현을 복합하는 것이 아니라 객체를 합성하는 방법을 제공한다는 것입니다. 이는 컴파일 단계에서가 아닌 런타임 단계에서 복합 방법이나 대상을 변경할 수 있다는 점에서 유연성을 갖습니다.
복합체 패턴(Composite Pattern) 개념 및 예제 코드
복합체 패턴에 대해 실생활에서 예를 들어 설명해보겠습니다.
파워포인트에 삼각형, 사각형, 원을 각각 하나씩 만들어 놓고 삼각형과 사각형을 그룹화했다고 가정하겠습니다. 이제 우리는 모든 도형을 빨간색으로 색을 칠하려고 합니다.
이때 우리가 채우기 버튼을 누를 때 선택하는 것이 어떤 도형인지, 혹은 그룹인지에 대해서 구분하지 않아도 됩니다. 파워포인트에서는 도형 하나에 대한 채우기와 그룹 전체에 대한 채우기 버튼이 같습니다.
이처럼 복합체 패턴은 전체 도형들을 하나의 도형을 다루듯이 관리할 수 있다는 특징을 지닙니다.
쉽게 말해 “일괄적인 관리”가 가능한 것이지요.
복합체 패턴은 다음과 같은 오브젝트들을 갖습니다.
Base Component – 베이스 컴포넌트는 클라이언트가 composition 내의 오브젝트들을 다루기 위해 제공되는 인터페이스를 말합니다. 베이스 컴포넌트는 인터페이스 또는 추상 클래스로 정의되며 모든 오브젝트들에게 공통되는 메소드를 정의해야 합니다.
– 베이스 컴포넌트는 클라이언트가 composition 내의 오브젝트들을 다루기 위해 제공되는 인터페이스를 말합니다. 베이스 컴포넌트는 인터페이스 또는 추상 클래스로 정의되며 모든 오브젝트들에게 공통되는 메소드를 정의해야 합니다. Leaf – composition 내 오브젝트들의 행동을 정의합니다. 이는 복합체를 구성하는 데 중요한 요소이며, 베이스 컴포넌트를 구현합니다. 그리고 Leaf는 다른 컴포넌트에 대해 참조를 가지면 안됩니다.
– composition 내 오브젝트들의 행동을 정의합니다. 이는 복합체를 구성하는 데 중요한 요소이며, 베이스 컴포넌트를 구현합니다. 그리고 Leaf는 다른 컴포넌트에 대해 참조를 가지면 안됩니다. Composite – Leaf 객체들로 이루어져 있으며 베이스 컴포넌트 내 명령들을 구현합니다.
예제를 통해 이해를 돕도록 하겠습니다.
1. Base Component
Base Component는 Leaf와 Composite의 공통되는 메소드들을 정의해야 합니다.
예제에서는 Shape 인터페이스 내에 각각 도형마다 색을 입히는 draw() 메소드를 정의하도록 하겠습니다.
Shape.java
public interface Shape { public void draw(String fillColor); }
2. Leaf Objects
Leaf 객체들은 복합체에 포함되는 요소로, Base Component를 구현해야 합니다.
예제에서는 Triangle과 Circle 클래스를 정의하도록 하겠습니다.
Triangle.java
public class Triangle implements Shape { @Override public void draw(String fillColor) { System.out.println(“Drawing Triangle with color “+fillColor); } }
Circle.java
public class Circle implements Shape { @Override public void draw(String fillColor) { System.out.println(“Drawing Circle with color “+fillColor); } }
3. Composite Objects
Composite 객체는 Leaf 객체들을 포함하고 있으며, Base Component를 구현할 뿐만 아니라 Leaf 그룹에 대해 add와 remove를 할 수 있는 메소드들을 클라이언트에게 제공합니다.
Drawing.java
public class Drawing implements Shape { //collection of Shapes private List
shapes = new ArrayList (); @Override public void draw(String fillColor) { for(Shape sh : shapes) { sh.draw(fillColor); } } //adding shape to drawing public void add(Shape s) { this.shapes.add(s); } //removing shape from drawing public void remove(Shape s) { shapes.remove(s); } //removing all the shapes public void clear() { System.out.println(“Clearing all the shapes from drawing”); this.shapes.clear(); } } 여기서 중요한 것은 Composite Object 또한 Base Component를 구현해야 한다는 것입니다.
그렇게 해야만 클라이언트가 Composite 객체에 대해서 다른 Leaf들과 동일하게 취급될 수 있습니다.
아직까지 이해가 잘 안되더라도 괜찮습니다.
이제 우리가 만든 예제 코드를를 테스트하는 코드를 보면 확실하게 이해 가실 것입니다.
TestCompositePattern.java
public class TestCompositePattern { public static void main(String[] args) { Shape tri = new Triangle(); Shape tri1 = new Triangle(); Shape cir = new Circle(); Drawing drawing = new Drawing(); drawing.add(tri1); drawing.add(tri1); drawing.add(cir); drawing.draw(“Red”); List
shapes = new ArrayList<>(); shapes.add(drawing); shapes.add(new Triangle()); shapes.add(new Circle()); for(Shape shape : shapes) { shape.draw(“Green”); } } } Drawing Triangle with color Red Drawing Triangle with color Red Drawing Circle with color Red Drawing Triangle with color Green Drawing Triangle with color Green Drawing Circle with color Green Drawing Triangle with color Green Drawing Circle with color Green
자, 위 코드를 보시면 drawing 객체를 통해 Triangle, Circle 등의 Leaf 객체들을 Group으로 묶어서 한 번에 동작을 수행할 수 있습니다. 나아가 drawing 객체 또한 다른 도형들과 마찬가지로 Shape 인터페이스를 구현하고 있기 때문에 변수 shapes에서 살펴보는 것과 같이 drawing이 다른 도형들과 함께 취급될 수 있습니다.
반응형
[디자인패턴] 컴포지트 패턴
반응형
컴포지트 패턴(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
처음 읽어보고 나의 반응…
아니 시방 이게 뭔소리여?
자 이제 이 컴포지트 패턴을 이해해보자
컴포지트 패턴과 가장 유사한 예시로는 윈도우 파일시스템을 떠올릴 수 있다. File 이라는게 있고 Directory라는게 있다.
여러분이 알다시피 디렉토리는 파일을 담는다.
그럼 아래와 같이 코드로 나타낼 수 있겠다
Class File{ public void operation(){} } class Directory{ public List
lists; public void operation(){} public void add(File f){ list.add(f); } public void remove(File f){ list.add(f); } public File getChild(int index){ return list.at(index); } } 자 여기서 정의를 다시보자
컴포지트 패턴(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
여기서 단일객체는 File을 의미하고 복합객체는 Directory를 의미한다.
즉 복합개체란 단일객체를 여러개 들고다니는 객체이다.
파일 시스템에 비유하면 디렉토리는 여러개의 파일을 들고 다닌다.
여기서 하나 더 여러분이 아는 사실은 디렉토리는 다른 디렉토리를 담을 수 있다. 즉
디렉토리는 파일과 다른 디렉토리를 동일 취급한다 <---> 단익객체와 복합객체 모두 동일하게 다루도록 한다
라는 의미가 되시겠다.
그림을 다시보자
여기서 Leaf는 File을 의미하고 Composite는 Directory를 의미한다.
즉 Leaf와 Composite를 동일하게 취급하겠다는 뜻이다!!!
Leaf와 Composite를 동일하게 취급하려면 어떻게 해야될까?
바로 두 클래스를 모두 Component를 상속받게 만들면 된다!
interface Component{ } Class File extends Component { public void operation(){} } class Directory extends Component { public List
lists; public void operation(){} public void add(Component f){ list.add(f); } public void remove(Component f){ list.add(f); } public Component getChild(int index){ return list.at(index); } } 위에처럼 코드를 고치면 이제 Directory는 다른 Directory를 담을 수 있다!!!
자 그럼 마직으로 이 패턴을 사용하면 무슨 이점을 얻을 수 있을 까?
컴포지트 패턴(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
저 노란줄이 무슨의미인지 잘 감이 안잡힌다.
하지만 여러분이 디렉토리와 파일의 구조를 떠올려보면 쉽게 이해할 수 있을것이다!
폴더와 파일의 관계는 위 그림처럼 트리구조로 나타낼 수 있다!
자 그럼 아래 말이 이제 감이 잡히는가?
객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴
위 그림과 설명이 이제 완벽하게 이해가 될 것이다.
Leaf와 Composite를 폴더와 파일의 트리구조 처럼 나타내고 싶을 때 컴포지트 패턴을 사용하는 것이다!!
반응형
키워드에 대한 정보 컴포지트 패턴
다음은 Bing에서 컴포지트 패턴 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 디자인패턴, Composite Pattern, 콤포짓 콤포지트 패턴
- 디자인패턴
- OOP
- 패턴
- 구조
- 구조 디자인 패턴
- Design Pattern
디자인패턴, # #Composite #Pattern, # #콤포짓 #콤포지트 #패턴
YouTube에서 컴포지트 패턴 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 디자인패턴, Composite Pattern, 콤포짓 콤포지트 패턴 | 컴포지트 패턴, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.