[CS-Design Pattern] 컴포지트 패턴

지영·2023년 9월 25일
0

CS

목록 보기
73/77
post-custom-banner

Composite Pattern

📢 객체들을 트리 구조로 구성한 다음, 이러한 구조를 개별 객체인 것처럼 사용할 수 있는 패턴이다.

  • 사용 상황 : 서비스의 핵심 모델을 트리로 나타낼 수 있는 경우에만 의미가 있다.

  • 구조

    • Component : 트리의 단일 객체와 복합 객체 모두에게 공통적인 인터페이스를 제공한다.
    • Leaf : 일반적인 트리구조에서의 Leaf Node와 같은 의미이다. Leaf는 단일 객체로만 이루어져 있어 대부분의 실제 작업을 수행한다.
    • Container : 컴포지트와 같은 의미이다. 하위 요소들을 모두 포함하는 요소이다. 대신 자식들의 구체적인 클래스까지는 알지 못하고 공통 인터페이스를 통해서 모든 하위 요소와 함께 작동한다. 하위 요소중 자신과 같은 Container가 있다면 자식 Container에게 작업을 위임하여 결과를 리턴받고 결과를 종합하여 응답한다.
    • Client : Component 인터페이스를 통해 모든 구성요소와 함께 작동한다. 결과적으로 트리 내으 모든 요소에 대해서 동일한 작업을 수행한다.
  • 예시
    ProductBox라는 두 가지 유형의 객체가 있다.

  • Product : 박스 포장이 없어 가격을 바로 알 수 있다.

  • Box : 박스포장이 되어 있어 해당 주문의 총 가격을 바로 알 수 없다. Box내에 는 여러 Product와 작은 Box로 이루어져 있을 수 있기 때문이다. 따라서 총 가격을 알기 위해서는 모든 포장된 상자를 풀어 살펴보아야 알 수 있다.

즉, 제품의 총 가격은 재귀적으로 접근하여 작은 Box 또한 자신이 담겨있는 큰 Box와 동일한 매커니즘으로 가격을 구할 수 있다.

  • 장점
    • 트리를 구성하는 객체들의 구체적인 클래스에 대해서는 신경쓰지 않아도 된다. 왜냐하면 모두 공통 인터페이스를 통해 동일하게 처리할 수 있기 때문이다. (*일관성, 재사용성 높음)
    • 새로운 개별 객체나 복합 객체를 추가하더라도 클라이언트가 코드를 수정할 필요가 없다. (*유연성과 구조적 안정성이 높음)
  • 단점
    • 객체의 구조가 복잡한 경우에는 효과적이지만, 반대로 객체의 구조가 단순한 경우에는 오히려 설계의 복잡성을 증가시킬 수 있다.
    • 개별 객체와 복합 객체가 서로 다른 인터페이스를 가지는 경우나, 복합 객체 내부 구조가 동적으로 변하는 경우에는 컴포지트 패턴을 사용하기 힘들다.

따라서, 컴포지트 패턴은 사용자 입장에서는 이게 단일 객체인지 복합 객체인지 신경쓰지 않고 사용할 수 있다는 장점이 있지만 설계가 지나치게 범용성을 갖기 때문에 새로운 요소를 추가할 때 복합 객체에서 구성 요소에 제약을 갖기가 힘들다.

✔ 적용 예제

  • Product 인터페이스, 클래스
public interface Products{
	int getPrice();
}


public class Product implements Products{
	int price = 110;
    
    @Override
    public int getPrice(){
    	return this.price;
    }

}
  • Box 클래스
public class Box implements Products{
	List<Products> products = new ArrayList<Products>();
    int price;
    
    public void addProducts(Products product){
    	products.add(product);
    }
    
    @Override
    public int getPrice(){
    	for(Products product : products){
        	this.price += product.getPrice();
           
        }
        return this.price;
    }

}
  • Main함수
public class Main{
	public static void main(String[] args) {
    	Box box1 = new Box();
        box1.addProduct(new Product());
        box1.addProduct(new Product());
        box1.addProduct(new Product());
        
        
        Box box2 = new Box();
        box2.addProduct(new Product());
        box2.addProduct(new Product());
        box2.addProduct(box1);
        
        System.out.println(box2.getPrice());
    }

}



* 참고 : https://velog.io/@bae_mung/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EA%B5%AC%EC%A1%B0-Composite-Pattern, https://github.com/gyoogle/tech-interview-for-developer/blob/master/Design%20Pattern/Composite%20Pattern.md
profile
꾸준함의 힘을 아는 개발자📍
post-custom-banner

0개의 댓글