In this post by Fabrizio Giudici's he introduces you to what he calls the Java Observation API based on the following key abstractions:
* An Observer represents entities capable to make observations. It may be a physical person, or a device, or anything else makes sense.
* An Observation is made at a certain time and Location, by one or more Observers and is composed of one or more ObservationItems.
* An ObservationItem pairs an Observable with a Cardinality.
* An Observable has no special properties and can be anything.
* A Cardinality may be a single integer number, a close or open range of integers (e.g. "between 10 and 20", or "more than 5"), or "undefined".
* An ObservationSet is a set of Observations.
* A Source is where a certain datum comes from (i.e. who or what provided it, inserting into the database).
Read Fabrizio Giudici's post 'The Observation API (hey, it's not the Observable pattern)':