There are two interfaces in the pattern.
The abstraction is a governing interface which tends to be a
must-inherit or abstract-class. It ensures that refined abstractions hold a
reference to the concrete implementation. It also ensures that they implement
the abstract operation.
The implementation is an interacting interface which ensures
that we can swap implementations at will without causing any hiccups.
Namespace/Scope/Accessor issues
Coding a public property into the abstraction which sets the
implementer being used allows you to change implementers on the fly.
Listing 4
Public MustInherit Class Evaluation
…
Public Property RatingRenderDevice() As Implementors.RatingRenderer
…
Set(ByVal Value As Implementors.RatingRenderer)
RenderingDevice = Value
End Set
End Property