컴포지트
컴포지트 패턴
컴포지트 패턴은 클라이언트가 복합 객체나 단일객체를 동일하게 취급할 수 있도록 한다. 컴포지트 패턴을 이용하면 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있다. 이 패턴을 통해 composite(복합)객체를 만들어낼 수 있다.
언제 사용하는가
복합 객체와 단일 객체의 처리 방법이 동일한 경우, 전체-부분 관계로 정의가 되고, 이를 효율적으로 정의할 수 있다.
출처
Client클래스는 공통 인터페이스 Component만 관여한다. Leaf는 Component 인터페이스를 구현하는 객체이며, Composite는 Component의 객체자식을 유지하면서 요청을 전달하는 역할을 한다.
코드로 보는 컴포지트 패턴
Component 공통 인터페이스
package compositepattern;
public interface Graphic {
public void print();
}
leaf에 해당하는 구현객체
package compositepattern;
public class Ellipse implements Graphic{
@Override
public void print() {
System.out.println("Ellipse");
}
}
Composite 인터페이스의 내용물을 구현한것을 알 수 있다.
자식들을 관리하는 Composite
package compositepattern;
import java.util.ArrayList;
import java.util.List;
public class CompositeGraphic implements Graphic{
private List<Graphic> childGraphics = new ArrayList<Graphic>();
@Override
public void print() {
for (Graphic graphic : childGraphics) {
graphic.print();
}
}
public void add(Graphic graphic) {
childGraphics.add(graphic);
}
public void remove(Graphic graphic) {
childGraphics.remove(graphic);
}
}
인터페이스 구현체들을 저장할 수 있는 리스트를 만들고, 저장과 삭제 기능을 구현해 두었다.
동시에 Component의 기능인 print를 오버라이딩 하였다.
드라이버 코드와 서로의 관계
package compositepattern;
public class Driver {
public static void main(String[] args) {
Ellipse ellipse1 = new Ellipse();
Ellipse ellipse2 = new Ellipse();
Ellipse ellipse3 = new Ellipse();
Ellipse ellipse4 = new Ellipse();
CompositeGraphic graphic = new CompositeGraphic();
CompositeGraphic graphic1 = new CompositeGraphic();
CompositeGraphic graphic2 = new CompositeGraphic();
graphic1.add(ellipse1);
graphic1.add(ellipse2);
graphic1.add(ellipse3);
graphic2.add(ellipse4);
graphic.add(graphic1);
graphic.add(graphic2);
graphic.print();
}
}
리프 객체를 4개 만들고, 콤포지트 객체인 그래픽1, 2에 각각 3개 1개를 넣어주었다,
그리고 컴포지트 객체에 이를 다시 넣어 print 하면
안에 들어간 4개의 객체가 출력되는것을 볼 수 있다.
이러한 구조를 가지고 있는것을 볼 수 있다.
Component의 두가지 방식
타입의 안정성
지금까지 보여준 예시는 타입의 안정성을 추구하는 방식이다.
Component에는 자식을 다루는 메소드가 없고, 오로지 Composite에만 있는것이다. 이렇게되면 Leaf가 자식을 다루는 객체를 호출 할 수 없고, Client 역시 이를 사용할 수 없다.
일관성
일관성을 추구하는 방식은, Component가 자식을 관리하는 메소드들을 전부 가지고있다. 따라서 Leaf가 자식관리 메소드를 호출 할 수 있고 이는 클라이언트도 이에 접근할 수 있게 된다.
이론상의 컴포지트 패턴은 안정성보다는 일관성을 더 강조한다고 한다.
Author And Source
이 문제에 관하여(컴포지트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@blacklandbird/컴포지트저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)