프로그래밍/디자인패턴

디자인 패턴 - Composite (Structural Pattern)

aiemag 2021. 2. 17. 00:53
반응형

Structural Pattern인 Composite Pattern에 대해 정리합니다.

 

 


Definition

'그릇'과 '내용물'을 동일시해서 '그릇'이 '내용물' 또는 '그릇'을 포함할 수 있는 재귀적인 구조를 만들기 위한 패턴

 

Composite Pattern은 Structural Pattern에 해당합니다.

 


Class Diagram

Leaf는 '내용물'의 역할을 합니다.

Composite는 '그릇' 및 '내용물'의 역할을 합니다.

 

Leaf와 Composite는 Component를 상속받아, Composite class가 Composite 및 Leaf class를 재귀적으로 담을 수 있습니다.

 


Sample Case

다음은 Composite 패턴을 적용한 시나리오입니다.

 

최대한 필요한 내용만 class와 method에 포함하였습니다.

 

Scenario

우리는 Client에게 File System을 제공합니다.

 

File System은 Directory와 File로 이루어지고, Directory와 File은 Entity라는 공통 형태로 관리될 수 있습니다.

Directory에는 Entity 형태(File 또는 Directory)의 객체면 모두 포함할 수 있는 add()라는 기능을 제공합니다.

File에는 홀로 존재하고 다른 Entity를 포함할 수 없습니다.

 

Class Diagram

Entity class는 File과 Directory의 abstraction class 이기 때문에 Directory는 File 및 Directory를 같은 형태로 쉽게 포함할 수 있습니다.

 

 

Code

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main {
 
    public static void main(String[] args) {
        Directory rootDir = new Directory("root");        
        Directory usrDir = new Directory("usr");
        Directory binDir = new Directory("bin");
        
        rootDir.add(usrDir);
        rootDir.add(binDir);
        
        usrDir.add(new File("test1.txt"));
        usrDir.add(new File("test2.txt"));
        
        rootDir.printList();
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
public abstract class Entity {
    public abstract String getName();
    
    protected abstract void printList();
    
    public void add(Entity entity) {}
    
    public String toString() {
        return getName();
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class File extends Entity{
    private String name;
    
    public File(String name) {
        this.name = name;
    }
    
    public String getName() {
        return this.name;
    }
    
    protected void printList() {
        System.out.println("/" + this);
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.ArrayList;
import java.util.Iterator;
 
public class Directory extends Entity{
    private String name;
    private ArrayList entities = new ArrayList();
    
    public Directory(String name) {
        this.name = name;
    }
    
    public String getName() {
        return this.name;
    }
    
    protected void printList() {
        System.out.println("/" + this);
        
        Iterator it = entities.iterator();
        while(it.hasNext()) {
            Entity entity = (Entity)it.next();
            entity.printList();
        }
    }
    
    public void add(Entity entity) {
        entities.add(entity);
    }
}
cs

 

실행 결과입니다.

 

반응형