구조 패턴: 컴포짓 패턴
소개
- 그룹 전체와 개별 객체를 동일하게 처리할 수 있는 패턴이다. 그러나 트리 형태의 계층 구조에만 적용할 수 있다.
- 클라이언트 입장에서는 '전체'나 '부분'이나 모두 동일할 컴포넌트로 인식할 수 있는 계층 구조를 만든다.
1) 장점
- 복잡한 트리 구조를 편리하게 사용할 수 있다.
- 다형성과 재귀를 활용할 수 있다.
- 클라이언트 코드를 변경하지 않고 새로운 엘리먼트 타입을 추가할 수 있다.
2) 단점
- 트리를 만들어야 하기 때문에(공통된 인터페이스 정의) 객체를 지나치게 일반화(추상화) 해야 하는 경우도 생길 수 있다.
구현
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);
}
}
Author And Source
이 문제에 관하여(구조 패턴: 컴포짓 패턴), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@zenon8485/구조-패턴-컴포짓-패턴저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)