Слуга (шаблон проєктування)

Слуга (англ. 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);
		}
	}
}

Див. також ред.

Джерела ред.