본문 바로가기

OOP/디자인 패턴

composite 패턴

1. composite 패턴이란?

한마디로 정의하면 포함하는 것과 포함되는 것들을 같은 방식으로 다루고 싶을 때 사용한다.

이를 가장 잘 나타낼 예시가 파일 시스템이다.

우리는 폴더 내에 또 다른 폴더 및 파일을 넣을 수 있다.

폴더나 파일은 크기 구하기, 삭제 등 같은 방식으로 다뤄야하는 것들이 있다.

이처럼 포함하는 것(폴더)와 포함되는 것(파일)을 같은 방식(크기 구하기, 삭제 등)으로 다루고 싶을 때  composite 패턴을 사용한다.

2. 예시 코드

2-1) 파일 및 폴더 만들기

interface FileSystem{
    fun getSize():Int
    fun remove()
}

class File(private val name : String, private val size : Int) : FileSystem{
    override fun getSize(): Int {
        Log.e("File : $name", "size : $size")
        return size
    }

    override fun remove() {
        Log.e("File : $name", "delete")
    }

}

class Folder(private val name : String) : FileSystem{
    private val includeds : MutableList<FileSystem> = mutableListOf()

    fun add(_fileSystem: FileSystem){
        includeds.add(_fileSystem)
    }

    override fun getSize(): Int {
        var total = 0
        for (included in includeds){
            total += included.getSize()
        }
        Log.e("Folder : $name", "size : $total")
        Log.e("-----","-----")
        return total
    }

    override fun remove() {
        for(included in includeds){
            included.remove()
        }
        Log.e("Folder : $name", "delete")
        Log.e("-----","-----")
    }

}

3. 실행 결과

        val folder1 = Folder("폴더 1")
        folder1.add(File("파일1-1",300))
        folder1.add(File("파일1-2",320))
        folder1.add(File("파일1-3",350))
        val folder2 = Folder("폴더 2")
        folder2.add(File("파일2-1",200))
        folder2.add(File("파일2-2",150))
        folder2.add(File("파일2-3",190))

        folder1.add(folder2)
        folder1.getSize()

 

 

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

Mediator 패턴  (0) 2021.07.17
DI (Dependency Injection/의존성 주입)  (0) 2021.07.17
abstract-factory method 패턴  (0) 2021.07.08
Factory 패턴  (0) 2021.07.07
Decorator 패턴  (0) 2021.07.05