@startuml
package com.iluwatar.compositeentity {
  class App {
     + App(message: String, signal: String)
     + main(args : String[]) {static}
  }
  class CompositeEntity{
      - console : ConsoleCoarseGrainedObject
      + CompositeEntity()
      + setData(message: String, signal: String)
      + getData()
      + init()
    }
  abstract CoarseGrainedObject{
    - dependentObjects : DependentObject[]
    + CoarseGrainedObject()
    + setData(data: T[])
    + getData()
  }
  abstract DependentObject{
      - data : T
      + DependentObject()
      + setData(data: T)
      + getData()
  }
  class ConsoleCoarseGrainedObject{
      + ConsoleCoarseGrainedObject()
      + getData()
      + init()
  }
  class MessageDependentObject{
          + MessageDependentObject()
  }
  class SignalDependentObject{
            + SignalDependentObject()
  }

  MessageDependentObject --|> DependentObject
  SignalDependentObject  --|> DependentObject
  ConsoleCoarseGrainedObject --|> CoarseGrainedObject
  CompositeEntity -right-> ConsoleCoarseGrainedObject
  CoarseGrainedObject "1" o--> "0.." DependentObject
  App .right.> CompositeEntity
}
@enduml
