Open systems have been defined[28,1,65] as encapsulated, reactive, and spatially and temporally extensible systems: They are composed of possibly many encapsulated components, each of which is normally described as an object. Each component supports one or more public interfaces. The inner workings of each component are separately specified via a normally inaccessible implementation description (often a class). Open systems are reactive in that they do not just perform a single one-time service; most functionality is provided ``on-demand'', in reaction to a potentially endless series of requests. Open systems are spatially extensible when components need not bear fixed connectivity relations among each other. They may interact via message passing mechanisms ranging from local procedure calls to multi-threaded invocations to asynchronous remote communication. And open systems are temporally extensible to the extent to which their components and functionality may be altered across a system's lifetime, typically by adding new components and new component types (perhaps even while the system is running) and/or updating components to support additional functionality.
For example, an open system supporting financial trading might include a set of components that ``publish'' streams of stock quotes, those that gather quotes to update models of individual companies, those serving as traders issuing buys and sells of financial instruments, and so on. Such a system possesses each of the above features: It relies on interfaces (e.g., QuotePublisher) with multiple implementations. It contains reactive components handling a constant influx of messages. It is intrinsically distributed in order to deal with world-wide markets. And it may evolve in several ways across time; for example to accommodate a new company listed on an exchange, or to replace components computing taxes with interoperable versions reflecting tax law changes.