From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001 From: Sven Eisenhauer Date: Fri, 10 Nov 2023 15:11:48 +0100 Subject: add new repo --- .../hjp5/examples/Listing1018.java | 106 +++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 Master/Reference Architectures and Patterns/hjp5/examples/Listing1018.java (limited to 'Master/Reference Architectures and Patterns/hjp5/examples/Listing1018.java') diff --git a/Master/Reference Architectures and Patterns/hjp5/examples/Listing1018.java b/Master/Reference Architectures and Patterns/hjp5/examples/Listing1018.java new file mode 100644 index 0000000..8613621 --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/examples/Listing1018.java @@ -0,0 +1,106 @@ +/* Listing1018.java */ + +interface MenuVisitor +{ + abstract void visitMenuEntry(MenuEntry2 entry); + abstract void visitMenuStarted(Menu2 menu); + abstract void visitMenuEnded(Menu2 menu); +} + +class MenuEntry2 +{ + protected String name; + + public MenuEntry2(String name) + { + this.name = name; + } + + public String toString() + { + return name; + } + + public void accept(MenuVisitor visitor) + { + visitor.visitMenuEntry(this); + } +} + +class Menu2 +extends MenuEntry2 +{ + MenuEntry2[] entries; + int entryCnt; + + public Menu2(String name, int maxElements) + { + super(name); + this.entries = new MenuEntry2[maxElements]; + entryCnt = 0; + } + + public void add(MenuEntry2 entry) + { + entries[entryCnt++] = entry; + } + + public String toString() + { + String ret = "("; + for (int i = 0; i < entryCnt; ++i) { + ret += (i != 0 ? "," : "") + entries[i].toString(); + } + return ret + ")"; + } + + public void accept(MenuVisitor visitor) + { + visitor.visitMenuStarted(this); + for (int i = 0; i < entryCnt; ++i) { + entries[i].accept(visitor); + } + visitor.visitMenuEnded(this); + } +} + +class MenuPrintVisitor +implements MenuVisitor +{ + String indent = ""; + + public void visitMenuEntry(MenuEntry2 entry) + { + System.out.println(indent + entry.name); + } + + public void visitMenuStarted(Menu2 menu) + { + System.out.println(indent + menu.name); + indent += " "; + } + + public void visitMenuEnded(Menu2 menu) + { + indent = indent.substring(1); + } +} + +public class Listing1018 +{ + public static void main(String[] args) + { + Menu2 filemenu = new Menu2("Datei", 5); + filemenu.add(new MenuEntry2("Neu")); + filemenu.add(new MenuEntry2("Laden")); + filemenu.add(new MenuEntry2("Speichern")); + Menu2 confmenu = new Menu2("Konfiguration", 3); + confmenu.add(new MenuEntry2("Farben")); + confmenu.add(new MenuEntry2("Fenster")); + confmenu.add(new MenuEntry2("Pfade")); + filemenu.add(confmenu); + filemenu.add(new MenuEntry2("Beenden")); + + filemenu.accept(new MenuPrintVisitor()); + } +} \ No newline at end of file -- cgit v1.2.3