按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
The definition of an interface that indicates that the controller should do nothing is as
follows (in the controller library LibLightingSystem):
Public Interface INoRemoteControlRoom
Inherits IRoom
End Interface
As you can see; INoRemoteControlRoom lacks methods and properties; like our placeholder
interface IRoom。 However; in this case; there are no methods or properties because the kernel
system does not require them。 The idea behind the INoRemoteControlRoom interface is to indicate
that the type implementing the interface is a room; but a room that should not be managed by
the controller。 Using the bedroom as an example; the implementation is as follows (defined in
the Home project):
Imports LibLightingSystem
Public Class Bedroom
Implements INoRemoteControlRoom
End Class
The definition of the bedroom allows the kernel to use an instance of a room; as follows:
Dim rooms As IRoom()= New IRoom(10) { }
rooms(0) = New Bedroom()
。 。 。
If TypeOf(rooms(0)) Is INoRemoteControlRoom Then
' Take appropriate action
End If
This code creates an array of rooms and assigns the index 0 to an instance of Bedroom。 The
If statement asks if the IRoom instance in index 0 is of type INoRemoteControlRoom。
…………………………………………………………Page 224……………………………………………………………
202 CH AP T E R 8 ■ L E A R N IN G AB OU T CO M P O N E N TO R IE N T E D AR C HI TE CT U R E
■Note Using placeholder interfaces and inheritance sets up a very powerful architecture that allows you to
create groupings。 You can then filter individual instances based on refinements of the grouping。 All of this is
possible in the Visual Basic language using TryCast() and Is; which allow queries of subclassed types of
an instance。 The queries are noninvasive and do not cause exceptions to be thrown。 The queries give you the
ability to make decisions based on whether an instance would like to be associated with a particular grouping
based on an interface。
Defining the IRemoteControlRoom Interface
Another type of room is one where the lighting is pletely managed by the controller。 The
controller does not seek the input of the room and manages the lighting based on the logic that
seems appropriate to it。
For example; a public…viewing area in a museum does not require light at certain times of
day。 When the museum is closed and the cleaners are finished; the lights can be turned off。 When
the museum is open; the lights are turned on。 This is a simple logic and can be pletely
managed by the controller。
The interface for the controlled room is defined as follows (in LibLightingSystem):
Public Interface IRemoteControlRoom
Inherits IRoom
ReadOnly Property LightLevel() As Double
Sub LightSwitch(ByVal lightState As Boolean)
Sub DimLight(ByVal level As Double)
End Interface
The only input that IRemoteControlRoom provides is information about whether the light is
on; off; or at a certain level。 This is through the LightLevel property。 The LightLevel property
is read…only; because the controller and the light level might bee out of sync。
For example; suppose it’s time for the museum to close; and the lights are switched off in
the public…viewing area。 But today; the cleaners took a little while longer than usual。 They turn
the lights back on so that they can see what they are doing。 The local device can do one of two
things: allow the light to be turned on without the approval of the controller; or not allow the
light to be turned on; requiring a controller intervention。 The best approach is to allow a local
override and let the cleaners turn on the light。 The LightLevel property is necessary so that the
controller can verify if the state of the light is what the controller expects it to be。
■Note When you are defining a kernel; sometimes it is necessary to add functionality into an interface that
verifies the state of the implementation。 Because the kernel is not in control of the implementation; the kernel
should not assume the state; as the state could change for some reason。 In the case of the lighting system;
the change could be due to a cleaner turning on the light after it was turned off。
…………………………………………………………Page 225……………………………………………………………
C H AP TE R 8 ■ L E AR N IN G AB O U T CO M P O N E N T O R IE N TE D A R CH I TE C TU R E 203
The IRemoteControlRoom methods LightSwitch() and DimLight() turn the light on or off
and set the light to a certain level; respectively。 These methods are used to control the state of
the implementation。
Defining the ISensorRoom Interface
Another type of room is one that can be controlled under certain circumstances。 Let’s go back
to the cleaner example where the cleaner turned on the light。 If the controller notices that the
light is on; even though it was turned off; should the controller turn off the light? You might say
sure; the controller should turn off the light。 However; that is not pletely correct。 Imagine
the situation where the cleaner turns on the light and the controller turns it off。 The cleaner would
immediately turn the light back on; and the controller would turn it off。 The cleaner would tape
the light switch down so that a constant battle of the light going on and off ensues (because this
battle is in milliseconds; the light remains on)。 A smarter approach would be to allow a timing
of the light。 But how mu