An object that fires an event is called a publisher. Examples of events include state changes, time-outs, and user inputs. Other objects, called subscribers, may need to be informed when such events occur. For example, when the value of a spreadsheet cell changes, other cells may need to update their values. In this example cells are both publishers and subscribers. But we want to be able to add and remove subscribers without having to modify the publisher's code and we want to avoid forcing the subscribers from having to constantly poll the publisher for events.
Introduce a reusable Subscriber interface with an abstract update method and a reusable Publisher class that maintains a list of subscribers. Provide the publisher with a notify method that calls the update method of each subscriber. Concrete publishers, like the cells in a spreadsheet can inherit this notification machinery from Publisher, and concrete subscribers can implement the Subscriber interface any way they see fit.
Here's a typical interaction: