구조 패턴: 컴포짓 패턴

소개

  • 그룹 전체와 개별 객체를 동일하게 처리할 수 있는 패턴이다. 그러나 트리 형태의 계층 구조에만 적용할 수 있다.
  • 클라이언트 입장에서는 '전체'나 '부분'이나 모두 동일할 컴포넌트로 인식할 수 있는 계층 구조를 만든다.

1) 장점

  1. 복잡한 트리 구조를 편리하게 사용할 수 있다.
  2. 다형성과 재귀를 활용할 수 있다.
  3. 클라이언트 코드를 변경하지 않고 새로운 엘리먼트 타입을 추가할 수 있다.

2) 단점

  1. 트리를 만들어야 하기 때문에(공통된 인터페이스 정의) 객체를 지나치게 일반화(추상화) 해야 하는 경우도 생길 수 있다.

구현

1) 인터페이스 구현

public interface Component {
	int getPrice();
}

2) 인터페이스를 구현하는 클래스 작성

Bag 클래스 )

public class Bag implements Component {

	private List<Component> components = new ArrayList();
    
    public void add(Component component) {
    	components.add(component);
    }
    
    public void List<Component> getComponents() {
    	return components;
    }
    
    @Override
    public int getPrice() {
    	return components.stream().mapToInt(Component::getPrice).sum();
    }
}

Item 클래스 )

public class Item implements Component {

	private String name;
    private int price;
    
    public Item(String name, int price) {
    	this.name = name;
        this.price = price;
    }
    
    @Override
    public int getPrice() {
    	return this.price;
    }
}

사용

1) 적용전

Item와 Bag 별도로 알아야 하는 메서드를 별도로 만들어야 한다.

public class Client {

	private void printPrice(Bag bag) {
    	int sum = bag.getItems().stream().mapToInt(Item.getPrice).sum();
        System.out.println(sum);
    }
    
    private void printPrice(Item item) {
    	System.out.println(item.getPrice());
    }
    
    public static void main(String[] args) {
    	Item doranBlade = new Item("도란검", 450);
        Item healPotion = new Item("체력 물약", 50);
        
        Bag bag = new Bag();
        bag.add(doranBlade);
        bag.add(healPotion);
        
        Client client = new Client();
        client.printPrice(doranBlade);
        client.printPrice(bag);
    }
}

2) 적용후

public class Client {

	private void printPrice(Component component) {
    	System.out.println(component.getPrice());
    }
    
    public static void main(String[] args) {
    	Item doranBlade = new Item("도란검", 450);
        Item healPotion = new Item("체력 물약", 50);
        
        Bag bag = new Bag();
        bag.add(doranBlade);
        bag.add(healPotion);
        
        Client client = new Client();
        client.printPrice(doranBlade);
        client.printPrice(bag);
    }
}

좋은 웹페이지 즐겨찾기