[디자인 패턴] Composite 패턴

이멀젼씨

·

2020. 3. 13. 11:45

- 정의

 

단일 객체와 복합 객체를 동일하게 처리 할 수 있게끔 하는 패턴이다.

 

- UML

1. Component라는 인터페이스 혹은 추상클래스를 만든다

2. Component를 상속 혹은 구현하는 Stuff클래스를 만든다

3. Component를 상속 혹은 구현하는 Box클래스를 만들고 Component타입을 담을 수 있는 List와 추가 및 삭제에 필요한 메서드를 정의한다

 

 

- 코드

 

Component abstract class

public abstract class Component {
	protected String name;
	public Component(String name) {
		this.name = name;
	}
	
}

Stuff class

public class Stuff extends Component{
	
	public Stuff(String name) {
		super(name);
	}
}

Box class

public class Box extends Component {
	List<Component> components = new ArrayList<>();
	
	public Box(String name) {
		super(name);
	}

	public void add(Component cp) {
		this.components.add(cp);
	}
	
	public void remove(Component cp) {
		this.components.remove(cp);
	}
	
	
}

Main class

public class Main {
	public static void main(String[] args) {
		Stuff book = new Stuff("책");
		Stuff ball = new Stuff("공");
		Stuff pen = new Stuff("펜");
		Stuff mp3 = new Stuff("mp3");
		Stuff phone = new Stuff("스마트폰");
		
		Box hugePlasticBox = new Box("거대한 플라스틱 박스");
		Box bigPaperBox = new Box("큰 종이 박스");
		Box mediumPlasticBox = new Box("중간크기 플라스틱 박스");
		Box smallPaperBox = new Box("작은 종이 박스");
		
		smallPaperBox.add(book);
		smallPaperBox.add(pen);
		
		mediumPlasticBox.add(phone);
		mediumPlasticBox.add(smallPaperBox);
		
		bigPaperBox.add(pen);
		bigPaperBox.add(mediumPlasticBox);
		
		hugePlasticBox.add(ball);
		hugePlasticBox.add(bigPaperBox);
		
		
		// hugePlasticBox 아래 있는 내용 모두 출력
		List<Component> temp = hugePlasticBox.components;
		int tempSize = temp.size();
		System.out.println(hugePlasticBox.name);
		String s = "     ";
		for(int i=0; i<tempSize; i++) {
			System.out.println(s+temp.get(i).name);
			if(temp.get(i) instanceof Box) {
				temp = ((Box) temp.get(i)).components;
				tempSize = temp.size();
				i=-1;
				s+=s;
			}
			
		}
		
	}
}

출력결과

더보기

거대한 플라스틱 박스
     공
     큰 종이 박스
          펜
          중간크기 플라스틱 박스
                    스마트폰
                    작은 종이 박스
                                        책
                                        펜

 

 

- 설명

 

컴포지트 패턴은 클라이언트가 복합 객체나 단일 객체를 동일하게 취급하는 것을 목적으로 한다

박스에 물건을 담는 것으로 예를 들었지만, 보통 컴퓨터에서 폴더 안에 파일과 다른 폴더가 들어가는 것과 같은 구조에서 사용된다. 트리구조를 만들 수 있다

 

필자가 해본 예제는 박스안에 물건도 들어갈 수 있지만, 해당 박스보다 작은 박스도 들어갈 수 있다는 것을 코드로 작성해본 것이다

 

장점

복합객체와 단일객체를 동일하게 취급하기 때문에 일관성있고 단순한 코드를 짤 수 있다.

'디자인패턴' 카테고리의 다른 글

[디자인 패턴] Visitor 패턴  (0) 2020.03.17
[디자인 패턴] Decorator 패턴  (0) 2020.03.15
[디자인 패턴] Bridge 패턴  (0) 2020.03.12
[디자인 패턴] AbstractFactory 패턴  (0) 2020.03.11
[디자인 패턴] Builder 패턴  (0) 2020.03.10