Implementation of the Observer pattern ====================================== A Model does not know that it is connected to a set of controllers, because this knowledge implies the knowledge of the *GUI* semantics, which has to be out-of-scope for the Model. Nevertheless, sometimes it is necessary for a Model to communicate to the *GUI* logics (generally the Controllers set) that the model state changed. This communication can be implemented by the *Observer* pattern, that provides a mechanism where *Observers* are notified when *observed* state in the model get changed. Even if models are typically observed by the *GUI* logics, the mechanism can be used also to decouple (isolate) models and other entities in the application logics. For example, models can be observed by other models. In *gtkmvc* Models' state has been extended with a mechanism called *Observable Properties*. An observable property is a part of the Model state which is also externally observable via an *Observer*. Every time an observable property changes, any interested Observer will be notified of the event. Figure :ref:`F:OBS` shows a Model (*Model1*) containing an observable property (*color*). There are also a Controller and a View (to show the colour), and the Controller is also an observer of *Model1*. Furthermore, there is another Observer that is model *Model2*, whose state the designer wanted to make dependent on the state of *Model1*, but without explicitly coupling the two models. When the property *color* changes for example to red, all connected Observers will be notified. Each observer will then perform the necessary operation according to the respective logics. For example, the Controller will make the connected View showing the occurred change. .. _F:OBS: .. figure:: images/obs.png :width: 14 cm :align: center Observable models and Observers Each Observer declares it is interested in receiving notifications on one or more properties changing, by a mechanism called *Registration*. Once an Observer (for example, a Controller) registered itself with the Model it is associated with, it will be notified of all changes of the observable properties. The Observers will be notified only of the property changes that they are actually interested in observing. Observable properties are then syntactically bounded to notifications sockets inside Observers. Later in this document, some implementation details are discussed, and further details about observable properties are presented. Finally, an example in the latest part should make all these concepts clearer. *Adapters* (see section :doc:`adapt` are powerful entities that can be used to automatically bind part of the view with part of the model with a minimal effort, without any need to couple with complex code and naming rules. However, *Adapters* should be used only after all the "manual" mechanisms have been well understood, and for this reason they are presented only at the end of this document. .. _KOBS: Supported types of Observable Properties ---------------------------------------- Observable properties can hold several types of values: Any type Change notification will occur only when the value is *assigned* to the property. Mutable sequential types Like lists and maps. A notification will occur when the *content* of the object changes, e.g. when one element of the sequence is assigned, added, removed, etc. User classes The user can declare the set of methods that can be observed (i.e. observables will be notified before and/or after observed object *methods* are called.) Signals To notify the observers that some event is occurred. All needed details about observable property types are explained later in this document (see section :ref:`OPtypes`).