Слуга (англ. Collecting Parameter) — шаблон проєктування, який дозволяє визначити спільний функціонал для різних ієрархій класів.
Нехай, необхідно реалізувати функціональність, яка спільна для різної ієрархії класів, наприклад, рух у просторі для геометричних фігур та тварин. Для того, щоб не дублювати код його можна винести у функцію, спільний клас (для мов що дозволяють множинне успадкування), у метод інтерфейсу (для мов, що дозволяють реалізацію інтерфейсу), метод розширення інтерфейсу, тощо.
// допоміжний клас
public class Position
{
private int xPosition;
private int yPosition;
public Position(int x, int y)
{
xPosition = x;
yPosition = y;
}
. . .
}
// інтерфейс, що об'єднує ієрархію класів, та надає необхідні методи для роботи "слуги"
public interface IMovable
{
void setPosition(Position p);
Position getPosition();
}
// несумісні ієрархії класів
public abstract class ShapeBase { ... }
public class Triangle: ShapeBase, IMovable { ... }
public class Circle: ShapeBase, IMovable { ... }
public abstract class AnimalBase { ... }
public class Cat: AnimalBase, IMovable { ... }
public class Duck: AnimalBase, IMovable { ... }
// слуга, містить спільний код
public class MoveServant
{
public void MoveTo(IMovable serviced, Position expectedPosition)
{
while (serviced.getPosition() != expectedPosition)
{
var dPosition = (expectedPosition - service.getPosition()) / 10;
serviced.setPosition(dPosition);
}
}
}