객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
역할을 설명하면
Component : 구체적인 부분. 즉, Leaf 클래스와 전체에 해당하는 Composite 클래스에 공통 인터페이스를 정의
Leaf : 구체적인 부분 클래스. Composite 객체의 부품으로 설정
Composite : 전체 클래스. 복수 개의 Component를 갖도록 정의, 그러므로 복수 개의 Leaf, 심지어 복수 개의 Composite 객체를 부분으로 가질 수 있음
으로 정리 할 수 있습니다.
사실 저렇게만 읽으면 감이 잘 안오니 code로 설명 드리겠습니다.
프로젝트를 진행하기 위해 팀원을 모았습니다. 우선 팀원들이 공통적으로 가지는 정보를 표시할 component를 만듭니다.
abstract class Jobcomponent{
abstract fun getName() : String
abstract fun getPosition() : String
abstract fun getPay() : Int
}
그 다음 개별로 표시할 Leaf를 만듭니다.
class SW_Engineer(name : String, position : String, pay : Int) : Jobcomponent(){
val mName = name
val mPosition = position
val mPay = pay
override fun getName(): String = mName
override fun getPosition(): String = mPosition
override fun getPay(): Int = mPay
}
class UI_Designer(name : String, position : String, pay : Int) : Jobcomponent() {
val mName = name
val mPosition = position
val mPay = pay
override fun getName(): String = mName
override fun getPosition(): String {
return "UI $mPosition"
}
override fun getPay(): Int = mPay
}
사실 SW_Engineer와 UI_Designer는 다를게 없지만 UI_Designer는 Position에 대하여 UI가 붙습니다.
그리고 위의 내용들을 통합하는 Compositie를 만듭니다.
class Party(name : String) : Jobcomponent(){
val mName = name
override fun getName(): String = mName
override fun getPosition(): String? = null
override fun getPay(): Int {
var totalpay =0
for( i in partyList){
totalpay += i.getPay()
}
return totalpay
}
private val partyList = mutableListOf<Jobcomponent>()
fun add(person : Jobcomponent){
partyList.add(person)
}
fun remove(person : Jobcomponent){
partyList.remove(person)
}
fun getIntoEach(){
partyList.forEach{it-> println("name : ${it.getName()}, position: ${it.getPosition()}")}
}
fun totalPersonCount() : Int = partyList.size
}
그리고 실행을 위한 client를 만듭니다.
fun main(){
val sw_1 = SW_Engineer("A","Android", 1000)
val sw_2 = SW_Engineer("B","ios", 1000)
val sw_3 = SW_Engineer("C","Server", 1500)
val ui_1 = UI_Designer("D","All_round",1200)
val party = Party("test project")
party.add(sw_1)
party.add(sw_2)
party.add(sw_3)
party.add(ui_1)
val totalpay = party.getPay()
val totalperson = party.totalPersonCount()
val partyName = party.getName()
println("project Name : $partyName")
println("totalPerson Count : $totalperson")
println("totlaPay: $totalpay")
party.getIntoEach()
}
실행을 하면
project Name : test project
totalPerson Count : 4
totlaPay: 4700
name : A, position: Android
name : B, position: ios
name : C, position: Server
name : D, position: UI All_round
이런 결과가 나옵니다.
참고
https://gmlwjd9405.github.io/2018/08/10/composite-pattern.html
https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%8F%AC%EC%A7%80%ED%8A%B8_%ED%8C%A8%ED%84%B4
https://jusungpark.tistory.com/26?category=630296
'2023년 이전 > 디자인 패턴' 카테고리의 다른 글
디자인 패턴 - 추상 팩토리 패턴(Abstract Factory Pattern) (0) | 2019.11.20 |
---|---|
디자인 패턴 - 팩토리 매서드 패턴 (Factory Method Pattern) (0) | 2019.11.20 |
디자인 패턴 - 데코레이터 패턴(Decorator Pattern) (0) | 2019.11.18 |
디자인 패터 - 옵저버 패턴(Observer Pattern) (0) | 2019.11.18 |
디자인 패턴 - 커맨드 패턴(Command Pattern) (0) | 2019.11.15 |