그릇과 내용물을 같은 종류로 취급하는 패턴
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 |