Controller+View+Observer pattern