Composite Pattern

Muzi·2023년 5월 4일
0

디자인 패턴

목록 보기
8/14

Intro

단일 객체와 그 객체들을 가지는 집합 객체를 같은 타입으로 취금해, 트리 구조로 객체들을 엮어 전체-부분(whole-part) 계층을 표현하는 패턴


장점

  • 사용자로 하여금 개별 객체와 복합 객체를 모두 동일하게 다룰 수 있다

    • 계층 구조상 모든 수준에서 동일한 행위를 제공 크고 작은 각 부분이 전체 구조를 투명하게 반영
    • 단일, 집합 구분하지 않고 코드 작성이 가능하다
  • 객체들이 모두 같은 타입으로 취급되어 새로운 클래스 추가가 용이하다


Composite Pattern

트리 구조를 다룰 때, 개발자 리프 노드와 브랜치를 구별해야한다.

여기서 코드는 많은 복잡성을 만들어 많은 에러를 초래한다.

이를 해결하기 위해, 복잡하고 원시적인 객체를 구분하지 않고 동일하게 취급하기 위한 인터페이스를 작성할 수 있다

  • Component

    • Leaf와 Composite가 구현해야하는 Interface(추상 클래스)
    • 인터페이스 or 추상 클래스로 정의되며 모든 object들에 공통되는 메소드를 정의해야함
    • Leaf와 Composite 모두 Component라는 같은 타입으로 다뤄진다
  • Leaf

    • Component 인터페이스를 구현
    • 트리 구조의 말단
    • leaf는 다른 컴포넌트에 대해 참조를 가지면 안된다
  • Composite

    • 하나 이상의 유사한 객체를 구성으로 설계된 객체로, 모두 유사한 기능을 나타냄
    • leaf 객체나 Composite(자식)으로 이루어져 있고 컴포넌트의 명령들을 구현한다
    • Client는 Composite를 통해 부분 객체(leaf, composite)를 다룰 수 있다

언제?

  • 복합 객체와 단일 객체의 처리 방법이 다르지 않을경우, 객체들 간에 계층구조가 있고 이를 표현해야할 때
  • client가 단일,집합 객체를 구분하지 않고 동일한 형태(균일하게)로 사용하고자 할 때
  • 코드를 더 단순하게 만드는 것이 목적이다
    • 예를 들어, 컴포짓을 이용해 XML을 생성하면 태그나 속성을 추가하기 위한 코드를 반복할 필요가 없다

구현

예시에 대한 설명이 이해하기 쉬웠습니다

  • 전체 객체들을 하나의 형식으로 관리할 수 있다

Component

  • Leaf와 Composite의 공통이 되는 메소드를 정의 - draw()
public interface Shape {
    public void draw(String paintColor);
}

Leaf

  • component를 구현해야한다

// Triangle.java
public class Triangle implements Shape {
    public void draw(String paintColor) {
    	System.out.println("삼각형이 다음 색상으로 색칠되었습니다. : " + paintColor);
    }
}
// Square.java
public class Square implements Shape {
    public void draw(String paintColor) {
    	System.out.println("사각형이 다음 색상으로 색칠되었습니다. : " + paintColor);
    }
}
// Circle.java
public class Circle implements Shape {
    public void draw(String paintColor) {
    	System.out.println("동그라미가 다음 색상으로 색칠되었습니다. : " + paintColor);
    }
}

Composite

  • Leaf를 포함하고, Component를 구현할 뿐 아니라 leaf 그룹에 대한 add, remove 메소드를 client에 제공
public class Drawing implements Shape {
	// 도형들
    private List<Shape> shapes = new ArrayList<>();
    
    @Override
    public void draw(String paintColor) {
    	for(Shape shape : shapes) {
        	shape.draw(paintColor);
        }
    }
    
    public void add(Shape s) {
    	this.shapes.add(s);
    ]
    
    public void remove(Shape s) {
    	this.shapes.remove(s);
    }
    
    public void clear() {
    	System.out.println("모든 도형을 제거합니다.");
        this.shapes.clear();
    }
}
  • 중요한 점은, Composite의 객체 또한 Component를 구현해야한다는 것
    • 클라이언트가 Composite객체에 대해 다른 Leaf와 동일하게 취급할 수 있기 때문

Client

public class CompositePattern {
    public static void main(String args[]) {
        Shape triangle = new Triangle();
        Shape circle = new Circle();
        Shape square = new Square();
        
        Drawing drawing = new Drawing();
        drawing.add(triangle);
        drawing.add(circle);
        drawing.add(square);
        
        drawing.draw("빨간색");
        }
}

단점

  • 설계를 일반화 시켜 객체간의 구분, 제약이 힘들다

Reference

https://dailyheumsi.tistory.com/193
https://velog.io/@newtownboy/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%EC%BB%B4%ED%8D%BC%EC%A7%80%ED%8A%B8%ED%8C%A8%ED%84%B4Composite-Pattern
https://johngrib.github.io/wiki/pattern/composite/
https://mygumi.tistory.com/343

profile
좋아하는걸 열심히

0개의 댓글