@startuml abstract class Node { /' (also ConcreteObserver) '/ + label: string + type: string + addOutput(Net*) + addInput(Net*) - inputs: Net*[] - outputs: Net*[] } class Net { /' (also ConcreteSubject) '/ - level: SignalLevel + setLevel(SignalLevel) ' only call notify when setLevel actually changes the level!!!!!!! } class Subject { - observers: Observer*[] + attach(Observer*) + detach(Observer*) + notify() } interface Observer { + update() } class GateAnd class GateNand class GateNor class GateNot class GateOr class GateXor class NodeOutput class NodeInput enum SignalLevel { LOW HIGH UNDEFINED } Node <|-[dashed]-- GateAnd Node <|-[dashed]-- GateNand Node <|-[dashed]-- GateNor Node <|-[dashed]-- GateNot Node <|-[dashed]-- GateOr Node <|-[dashed]-- GateXor Node <|-[dashed]-- NodeOutput Node <|-[dashed]-- NodeInput Subject <|-- Net Observer <|-[dashed]- Node Node -> "owner" Net Observer "*" - Subject class Parser { + loadFromFile() } class CircuitFactory { + run() + configure() } @enduml