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 |