복합 패턴
Composite pattern소프트웨어 엔지니어링에서 복합 패턴은 분할 설계 패턴이다.복합 패턴은 동일한 유형의 객체의 단일 인스턴스와 동일한 방식으로 처리되는 객체 그룹을 설명한다.복합체의 목적은 물체를 트리 구조로 "복사"하여 부분-전위계층을 나타내는 것이다.복합 패턴을 구현하면 고객은 개별 개체와 구성을 균일하게 처리할 수 있다.[1]
개요
복합 디자인 패턴은 유연하고 재사용 가능한 객체 지향 소프트웨어, 즉 구현, 변경, 테스트 및 재사용하기 쉬운 객체를 설계하기 위해 반복적인 설계 문제를 해결하는 방법을 설명하는 23가지 GoF 디자인 패턴 중 하나이다.
복합 디자인 패턴이 해결할 수 있는 문제는 무엇인가?
- 클라이언트가 부분 및 전체 개체를 균일하게 처리할 수 있도록 부분 그룹 계층 구조를 표시해야 한다.
- 하위 계층 구조는 트리 구조로 표현되어야 한다.
(1)을 정의할 때Part물체 및 (2)Whole컨테이너 역할을 하는 객체Part개체, 고객은 개체를 별도로 취급해야 하므로 클라이언트 코드가 복잡해진다.[3]
복합 설계 패턴에서 설명하는 솔루션은?
- 통합 정의
Component양쪽 부품에 대한 인터페이스(Leaf) 객체 및 전체 ()Composite) 객체. - 개인의
Leaf개체가 실행하다Component직접 연결,Composite개체가 하위 구성 요소로 요청을 전달함.
이를 통해 고객은Component치료할 인터페이스Leaf그리고Composite물체 균일:Leaf객체는 요청을 직접 수행하며,Composite개체는 요청을 하위 구성요소로 반복적으로 트리 구조 아래로 전달한다.이를 통해 클라이언트 클래스를 보다 쉽게 구현, 변경, 테스트 및 재사용할 수 있다.
아래 UML 클래스 및 개체 다이어그램을 참조하십시오.
동기
트리 구조 데이터를 다룰 때 프로그래머들은 종종 나뭇잎 노드와 가지를 구별해야 한다.이것은 코드를 더 복잡하게 만들고, 따라서 오류를 더 쉽게 만든다.솔루션은 복잡하고 원시적인 물체를 균일하게 처리할 수 있는 인터페이스다.객체 지향 프로그래밍에서 복합체는 하나 이상의 유사한 객체의 구성으로 설계된 객체로, 모두 유사한 기능을 나타낸다.이것은 물체들 간의 "has-a" 관계라고 알려져 있다.[4]핵심 개념은 개체의 그룹을 조작하는 것처럼 개체의 단일 인스턴스를 조작할 수 있다는 것이다.모든 복합 객체에 대해 수행할 수 있는 연산은 종종 최소 공통 분모 관계를 가진다.예를 들어 화면에 그룹화된 도형을 그리도록 시스템을 정의하는 경우, 단일 도형의 크기 조정과 동일한 효과(어떤 의미에서는)를 갖도록 도형 그룹 크기 조정을 정의하는 것이 유용할 것이다.
사용 시기
클라이언트가 객체의 구성과 개별 객체의 구성 차이를 무시할 때 복합체를 사용해야 한다.[1]프로그래머가 동일한 방법으로 여러 개체를 사용하고 있으며, 각 개체를 처리하는 코드가 거의 동일하다고 판단되는 경우 복합성이 좋은 선택이다. 원시성과 합성물을 동질성으로 취급하는 것이 이 상황에서는 덜 복잡하다.
구조
UML 클래스 및 개체 다이어그램
위의 UML클래스 다이어그램에서Client클래스는 를 의미하지 않는다.Leaf그리고Composite직급(직접)대신, The는Client보통을 가리킴Component인터페이스 및 치료 가능Leaf그리고Composite일률적으로
그Leaf학급은 아이가 없고, 그것을 실행한다.Component직접 접속하다
그Composite학급은 어린아이의 컨테이너를 유지하다.Component사물(물건)children) 및 요청을 다음 사용자에게 전달children(for each child in children: child.operation()).
객체 협업 다이어그램은 런타임 상호작용을 보여준다.이 예에서는 다음과 같이 한다.Client개체가 최상위 레벨로 요청을 전송함Composite목적어(유형)Component)는 나무 구조물에 있다.요청이 모든 아동에게 전달됨(수행됨)Component사물(물건)Leaf그리고Composite(물체) 나무 구조물을 아래로)
- 하위 관련 작업 정의
컨테이너에 어린이 구성요소를 추가/제거하는 것과 같은 어린이 관련 작동을 정의하고 구현하기 위한 두 가지 설계 변형이 있다.add(child)/remove(child)) 및 하위 구성 요소 액세스(getChild()):
- 균일성 설계:아동 관련 연산은 에 정의되어 있다.
Component접점이를 통해 고객은 치료할 수 있다.Leaf그리고Composite물체가 일률적으로그러나 고객이 아동 관련 작업을 수행할 수 있기 때문에 유형 안전성이 상실됨Leaf물건들 - 형식 안전을 위한 설계:하위 관련 작업은 에서만 정의된다.
Compositeclass. 고객은 반드시 치료해야 한다.Leaf그리고Composite사물이 다르다그러나 고객이 아동 관련 작업을 수행할 수 없기 때문에 유형 안전성이 확보됨Leaf물건들
복합 디자인 패턴은 형식 안전보다 통일성을 강조한다.
UML 클래스 다이어그램
- 구성 요소
- 합성물을 포함한 모든 구성요소에 대한 추상화
- 구성의 객체에 대한 인터페이스를 선언하다
- (선택사항) 재귀적 구조에서 구성요소의 부모에 접근하기 위한 인터페이스를 정의하고, 적절한 경우 구현한다.
- 잎
- 구성에서 잎사귀를 나타내다.
- 모든 구성 요소 메서
- 합성
- 복합 구성요소(자녀가 있는 구성요소)를 나타냄
- 어린이를 조종하는 방법을 구현하다.
- 일반적으로 모든 구성요소 방법을 하위 구성요소에 위임하여 구현
변형
설계 패턴에서 설명하듯이, 이 패턴은 복합 하위 클래스뿐만 아니라 주요 구성요소 인터페이스에 하위 제어 방법을 포함하는 것도 포함한다.보다 최근의 서술은 때때로 이러한 방법들을 생략한다.[7]
예
Java로 작성된 다음 예제는 타원 또는 여러 그래픽의 구성일 수 있는 그래픽 클래스를 구현한다.모든 그래픽은 인쇄할 수 있다.백커스-나우르스 형태로는
그래픽 ::= 타원 그래픽리스트 그래픽리스트 :::= 빈 그래픽리스트
그것은 몇 가지 다른 형태(직각 등)와 방법(번역 등)을 구현하도록 확장될 수 있다.
자바
수입하다 java.util.리스트; 수입하다 java.util.배열 목록; /*** "구성요소" */ 접점 그래픽 { //그래픽을 인쇄한다. 공중의 공허하게 하다 인쇄하다(); } /*** "복합" */ 계급 합성그래픽 기구들 그래픽 { //하위 그래픽 수집. 사유의 최종의 리스트<그래픽> 아동그래픽스 = 새로운 배열 목록<>(); //그래픽을 구성에 추가한다. 공중의 공허하게 하다 덧셈을(그래픽 그래픽의) { 아동그래픽스.덧셈을(그래픽의); } //그래픽을 인쇄한다. @오버라이드 공중의 공허하게 하다 인쇄하다() { 을 위해 (그래픽 그래픽의 : 아동그래픽스) { 그래픽의.인쇄하다(); //위임 } } } /*** "잎" */ 계급 타원체 기구들 그래픽 { //그래픽을 인쇄한다. @오버라이드 공중의 공허하게 하다 인쇄하다() { 시스템.밖으로.인쇄하다("엘리프스"); } } /** 클라이언트 */ 계급 합성데모 { 공중의 정태의 공허하게 하다 본래의(끈[] 아그) { //4개의 타원 초기화 타원체 타원1길 = 새로운 타원체(); 타원체 타원2길 = 새로운 타원체(); 타원체 타원3길 = 새로운 타원체(); 타원체 타원4길 = 새로운 타원체(); //타원이 들어 있는 두 개의 합성물 작성 합성그래픽 compositGraphic2 = 새로운 합성그래픽(); compositGraphic2.덧셈을(타원1길); compositGraphic2.덧셈을(타원2길); compositGraphic2.덧셈을(타원3길); 합성그래픽 compositGraphic3 = 새로운 합성그래픽(); compositGraphic3.덧셈을(타원4길); //두 개의 그래픽이 포함된 다른 그래픽 만들기 합성그래픽 컴포지트그래픽 = 새로운 합성그래픽(); 컴포지트그래픽.덧셈을(compositGraphic2); 컴포지트그래픽.덧셈을(compositGraphic3); //전체 그래픽을 인쇄한다("Elipse" 문자열의 4배). 컴포지트그래픽.인쇄하다(); } } 참고 항목
참조
- ^ a b Gamma, Erich; Richard Helm; Ralph Johnson; John M. Vlissides (1995). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. pp. 395. ISBN 0-201-63361-2.
- ^ Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison Wesley. pp. 163ff. ISBN 0-201-63361-2.
{{cite book}}: CS1 maint : 복수이름 : 작성자 목록(링크) - ^ "The Composite design pattern - Problem, Solution, and Applicability". w3sDesign.com. Retrieved 2017-08-12.
- ^ Scott Walters (2004). Perl Design Patterns Book. Archived from the original on 2016-03-08. Retrieved 2010-01-18.
- ^ "The Composite design pattern - Structure and Collaboration". w3sDesign.com. Retrieved 2017-08-12.
- ^ "The Composite design pattern - Implementation". w3sDesign.com. Retrieved 2017-08-12.
- ^ Geary, David (13 September 2002). "A look at the Composite design pattern". Java Design Patterns. JavaWorld. Retrieved 2020-07-20.
외부 링크
| Wikibook 컴퓨터 과학 디자인 패턴에는 다음과 같은 주제의 페이지가 있다: 다양한 언어에서의 복합 구현 |
- Java에서 복합 패턴 구현
- Portland Pattern Repository의 복합 패턴 설명
- IMT2000 3GPP - UML과 LePUS3에서의 복합패턴
- 클래스:CPAN에서 위임
- "상속 종말: Paul Baranowski의 "Automatic Run-time Interface Building for Aggregated Objects"
- PerfectJPattern 오픈 소스 프로젝트, Java에서 복합 패턴의 구성요소화된 구현 제공
- [1] Java 기반의 지속적인 구현
- 복합 디자인 패턴