본문 바로가기
2023년 이전/디자인 패턴

디자인 패턴 - 컴퍼지트 패턴 (Composite Pattern)

by JeongUPark 2019. 11. 19.
반응형

객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.

역할을 설명하면

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

 

반응형