@startuml
package com.iluwatar.priority.queue {
  class Application {
    + Application()
    + main(args : String[]) {static}
  }
  class Message {
    - message : String
    - priority : int
    + Message(message : String, priority : int)
    + compareTo(o : Message) : int
    + toString() : String
  }
  class PriorityMessageQueue<T extends Comparable> {
    - LOGGER : Logger {static}
    - capacity : int
    - queue : T[]
    - size : int
    + PriorityMessageQueue<T extends Comparable>(queue : T[])
    + add(t : T extends Comparable)
    - ensureCapacity()
    - hasLeftChild(index : int) : boolean
    - hasParent(index : int) : boolean
    - hasRightChild(index : int) : boolean
    + isEmpty() : boolean
    - left(parentIndex : int) : T extends Comparable
    - leftChildIndex(parentPos : int) : int
    - maxHeapifyDown()
    - maxHeapifyUp()
    - parent(childIndex : int) : T extends Comparable
    - parentIndex(pos : int) : int
    + print()
    + remove() : T extends Comparable
    - right(parentIndex : int) : T extends Comparable
    - rightChildIndex(parentPos : int) : int
    - swap(fpos : int, tpos : int)
  }
  class QueueManager {
    - messagePriorityMessageQueue : PriorityMessageQueue<Message>
    + QueueManager(initialCapacity : int)
    + publishMessage(message : Message)
    + receiveMessage() : Message
  }
  class Worker {
    - LOGGER : Logger {static}
    - queueManager : QueueManager
    + Worker(queueManager : QueueManager)
    - processMessage(message : Message)
    + run()
  }
}
QueueManager -->  "-messagePriorityMessageQueue" PriorityMessageQueue
Worker -->  "-queueManager" QueueManager
@enduml