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.
Coding a public property into the abstraction which sets the
implementer being used allows you to change implementers on the fly.
Public MustInherit Class Evaluation
Public Property RatingRenderDevice() As Implementors.RatingRenderer
Set(ByVal Value As Implementors.RatingRenderer)
RenderingDevice = Value