@startuml package com.iluwatar.masterworker.system.systemmaster { class ArrayTransposeMaster { + ArrayTransposeMaster(numOfWorkers : int) ~ aggregateData() : ArrayResult ~ setWorkers(num : int) : ArrayList } abstract class Master { - allResultData : Hashtable> - expectedNumResults : int - finalResult : Result - numOfWorkers : int - workers : ArrayList ~ Master(numOfWorkers : int) ~ aggregateData() : Result {abstract} - collectResult(data : Result, workerId : int) - divideWork(input : Input) + doWork(input : Input) ~ getAllResultData() : Hashtable> ~ getExpectedNumResults() : int + getFinalResult() : Result ~ getWorkers() : ArrayList + receiveData(data : Result, w : Worker) ~ setWorkers(int) : ArrayList {abstract} } } package com.iluwatar.masterworker.system { class ArrayTransposeMasterWorker { + ArrayTransposeMasterWorker() ~ setMaster(numOfWorkers : int) : Master } abstract class MasterWorker { - master : Master + MasterWorker(numOfWorkers : int) + getResult(input : Input) : Result ~ setMaster(int) : Master {abstract} } } package com.iluwatar.masterworker { class App { - LOGGER : Logger {static} + App() + main(args : String[]) {static} } class ArrayInput { + ArrayInput(data : int[][]) + divideData(num : int) : ArrayList> ~ makeDivisions(data : int[][], num : int) : int[] {static} } class ArrayResult { + ArrayResult(data : int[][]) } class ArrayUtilityMethods { - LOGGER : Logger {static} - RANDOM : Random {static} + ArrayUtilityMethods() + arraysSame(a1 : int[], a2 : int[]) : boolean {static} + createRandomIntMatrix(rows : int, columns : int) : int[][] {static} + matricesSame(m1 : int[][], m2 : int[][]) : boolean {static} + printMatrix(matrix : int[][]) {static} } abstract class Input { + data : T + Input(data : T) + divideData(int) : ArrayList> {abstract} } abstract class Result { + data : T + Result(data : T) } } Master --> "-finalResult" Result MasterWorker --> "-master" Master ArrayInput --|> Input ArrayResult --|> Result ArrayTransposeMasterWorker --|> MasterWorker ArrayTransposeMaster --|> Master @enduml