본문 바로가기

디자인 패턴/Java언어로 배우는 디자인패턴 입문 책 정리

Composite 패턴

그릇과 내용물을 같은 종류로 취급하는 패턴

ex. 디렉토리와 파일은 모두 디렉토리 안에 넣을 수 있음. 이런 점을 고려하여 디렉토리와 파일을 같은 종류로 취급


1. 코드

Entry: 접시와 음식을 같은 종류로 만들기 위한 추상 클래스

public abstract class Entry {
	public abstract String getName();
	public abstract int getWeight();
	public abstract void add(Entry entry);
	public abstract void showList();
}

 

Plate: 접시 역할 (접시 위에 접시 또는 음식이 올 수 있음)

public class Plate extends Entry {

	private String name;
	private List<Entry> entryList;
	
	public Plate(String name) {
		this.name = name;
	}

	@Override
	public String getName() {
		return name;
	}

	@Override
	public int getWeight() {
		if (entryList == null) {
			return 0;
		}
		
		int totalWeight = 0;
		for (Entry entry : entryList) {
			totalWeight += entry.getWeight();
		}
		return totalWeight;
	}

	@Override
	public void add(Entry entry) {
		if (entryList == null) {
			entryList = new ArrayList<>();
		}
		
		entryList.add(entry);
	}

	@Override
	public void showList() {		
		if (entryList == null) {
			return;
		}
		
		for (Entry entry : entryList) {
			entry.showList();
		}
	}
}

 

Food: 음식 역할 (음식 위에는 접시나 음식을 놓을 수 없음)

public class Food extends Entry {
	
	private String name;
	private int weight;

	public Food(String name, int weight) {
		this.name = name;
		this.weight = weight;
	}
	
	@Override
	public String getName() {
		return name;
	}

	@Override
	public int getWeight() {
		return weight;
	}

	@Override
	public void add(Entry entry) {
		System.out.println("음식에는 추가할 수 없습니다.");
	}

	@Override
	public void showList() {
		System.out.println(name);
	}
}

 

 

Main : Test클래스

public class Main {

	public static void main(String[] args) {
		Plate rootPlate = new Plate("rootPlate");
		Plate plate1 = new Plate("plate1");
		Plate plate2 = new Plate("plate2");
		rootPlate.add(plate1);
		rootPlate.add(plate2);
		
		plate1.add(new Food("food1", 1));
		plate1.add(new Food("food2", 2));
		
		plate2.add(new Food("food3", 3));
		
		Plate plate2_1 = new Plate("plate2-1");
		plate2_1.add(new Food("food4", 4));
		plate2.add(plate2_1);
		
		System.out.println(rootPlate.getWeight());
		rootPlate.showList();
	}
}

 

2. 특징

- 그릇에 있는 메소드를 구현 할 때 그릇 위에 있는게 그릇인지 음식인지 알 필요가 없다.

    - ex. getWeight 메소드에서 entry가 어떤 것인지 구분을 하지 않음

- 내용물 부분에서 add 메소드 같은 경우는 사용을 못하게 막아야 한다.

    - 위에 예에서는 간단히 추가를 못한다는 문구만 출력했지만, exception처리를 해도 될듯

- 재귀적인 구조를 가짐

 

3. 해당 패턴을 고려해볼만한 상황

- 그릇, 내용물의 관계를 가지는 객체를 만들 때

 

'디자인 패턴 > Java언어로 배우는 디자인패턴 입문 책 정리' 카테고리의 다른 글

Visitor 패턴  (0) 2021.02.07
Decorator 패턴  (0) 2021.01.30
strategy 패턴  (0) 2021.01.24
Bridge 패턴  (0) 2021.01.17
Abstract Factory 패턴  (0) 2021.01.16