@startuml package com.iluwatar.iterator { class App { - LOGGER : Logger {static} - TREASURE_CHEST : TreasureChest {static} + App() - buildIntegerBst() : TreeNode {static} - demonstrateBstIterator() {static} - demonstrateTreasureChestIteratorForType(itemType : ItemType) {static} + main(args : String[]) {static} } interface Iterator { + hasNext() : boolean {abstract} + next() : T {abstract} } } package com.iluwatar.iterator.bst { class BstIterator> { - pathStack : ArrayDeque>> + BstIterator>(root : TreeNode>) + hasNext() : boolean + next() : TreeNode> - pushPathToNextSmallest(node : TreeNode>) } class TreeNode> { - left : TreeNode> - right : TreeNode> - val : T extends Comparable + TreeNode>(val : T extends Comparable) + getLeft() : TreeNode> - getParentNodeOfValueToBeInserted(valToInsert : T extends Comparable) : TreeNode> + getRight() : TreeNode> + getVal() : T extends Comparable + insert(valToInsert : T extends Comparable) - insertNewChild(valToInsert : T extends Comparable) - isGreaterThan(val : T extends Comparable) : boolean - isLessThanOrEqualTo(val : T extends Comparable) : boolean - setLeft(left : TreeNode>) - setRight(right : TreeNode>) + toString() : String - traverseOneLevelDown(value : T extends Comparable) : TreeNode> } } package com.iluwatar.iterator.list { class Item { - name : String - type : ItemType + Item(type : ItemType, name : String) + getType() : ItemType + setType(type : ItemType) + toString() : String } enum ItemType { + ANY {static} + POTION {static} + RING {static} + WEAPON {static} + valueOf(name : String) : ItemType {static} + values() : ItemType[] {static} } class TreasureChest { - items : List + TreasureChest() + getItems() : List + iterator(itemType : ItemType) : Iterator } class TreasureChestItemIterator { - chest : TreasureChest - idx : int - type : ItemType + TreasureChestItemIterator(chest : TreasureChest, type : ItemType) - findNextIdx() : int + hasNext() : boolean + next() : Item } } TreasureChestItemIterator --> "-type" ItemType TreeNode --> "-left" TreeNode TreasureChestItemIterator --> "-chest" TreasureChest TreasureChest --> "-items" Item Item --> "-type" ItemType App --> "-TREASURE_CHEST" TreasureChest BstIterator ..|> Iterator TreasureChestItemIterator ..|> Iterator @enduml