ConcreteMilitaryUnit and soldier leaves share the MilitaryUnit abstraction, allowing the army tree to be displayed and counted recursively.
classDiagram
direction TB
class MilitaryUnit {
<<abstract>>
+add(unit)
+remove(unit)
+display(depth)
+reportUnitCounts() int
+reportWeaponCounts() int
}
class ConcreteMilitaryUnit
class NormalSoldier
class LazySoldier
class DrunkSoldier
class DeserterSoldier
MilitaryUnit <|-- ConcreteMilitaryUnit
MilitaryUnit <|-- NormalSoldier
MilitaryUnit <|-- LazySoldier
MilitaryUnit <|-- DrunkSoldier
MilitaryUnit <|-- DeserterSoldier
ConcreteMilitaryUnit o-- MilitaryUnit : children