In software engineering, the servant pattern defines an object used to offer some functionality to a group of classes without defining that functionality in each of them. A Servant is a class whose instance (or even just class) provides methods that take care of a desired service, while objects for which (or with whom) the servant does something, are taken as parameters.
Servant is used for providing some behavior to a group of classes. Instead of defining that behavior in each class - or when we cannot factor out this behavior in the common parent class - it is defined once in the Servant.
For example: we have a few classes representing geometric objects (rectangle, ellipse, and triangle). We can draw these objects on some canvas. When we need to provide a âÂÂmoveâ method for these objects we could implement this method in each class, or we can define an interface they implement and then offer the âÂÂmoveâ functionality in a servant. An interface is defined to ensure that serviced classes have methods that servant needs to provide desired behavior. If we continue in our example, we define an Interface âÂÂMovableâ specifying that every class implementing this interface needs to implement method âÂÂgetPositionâ and âÂÂsetPositionâÂÂ. The first method gets the position of an object on a canvas and second one sets the position of an object and draws it on a canvas. Then we define a servant class âÂÂMoveServantâÂÂ, which has two methods âÂÂmoveTo(Movable movedObject, Position where)â and moveBy(Movable movedObject, int dx, int dy). The Servant class can now be used to move every object which implements the Movable. Thus the âÂÂmovingâ code appears in only one class which respects the âÂÂSeparation of Concernsâ rule.
There are two ways to implement this design pattern:
This simple Java example shows the situation described above. This example is only illustrative and will not offer any actual drawing of geometric objects, nor specification of what they look like.
Design patterns Command and Servant are very similar and implementations of them are often virtually the same. The difference between them is the approach to the problem.
Even though design patterns Command and Servant are similar it doesnâÂÂt mean itâÂÂs always like that. There are a number of situations where use of design pattern Command doesnâÂÂt relate to the design pattern Servant. In these situations we usually need to pass to called methods just a reference to another method, which it will need in accomplishing its goal. Since we canâÂÂt pass references to methods in many languages, we have to pass an object implementing an interface which declares the signature of passed method.