Скажем, к примеру, у вас есть базовый абстрактный класс
public abstract Foo
{
IFlyable _fly;
ISwimmable _swim;
void performSwim()
{
_swim.swim();
}
void performFly()
{
_fly.fly();
}
}
И есть поведения / алгоритм, который вы будете иметь в вашей системе
interface IFlyable { void fly(); }
interface ISwimmable { void swim(); }
interface IVoteable { void vote(); }
и т. Д.
Теперь у вас есть несколько классов, которые реализуют это, с конкретным IFlyable, ISwimmable и т. Д.
class Bar: Foo { _swim = new ConcerteSwim(); }
class Baz: Foo { _fly = new ConcreteFly(); }
и т. Д.
Один из них использует шаблон стратегии в базовом классе Foo для изменения поведения.
Мы могли бы также использовать шаблон декоратора, чтобы обернуть его определенным поведением, но, поскольку декоратор обертывает его базовым классом, как мы на самом деле позволяем принципу открытого закрытия работать, не касаясь базового класса, если позже мы добавим больше поведений к объекты. Так как это поведение может иметь разные сигнатуры, когда мы добавляем больше, а не просто, например, как вызов в декораторе
void performSwim()
{
swimWithMoreSpeed() + foo.performSwim()
}
Полагаю, мой вопрос: если я добавлю больше поведения, как я не смогу изменить базовый класс и все еще иметь возможность сказать добавить IWeaponBehavior, ISomeBehaviour в класс.
например я хочу иметь класс
public class XYF: Foo
{
}
Но я хочу дать ему некоторое поведение ISomeBehaviour, есть ли способ, которым я мог бы сказать, обернуть его таким типом поведения, или, скорее, вот как ConcreteFoo обернуть его этим поведением и теперь делать вещи, а не реализовывать интерфейс на конкретном xyz, хотя это заставляет вас реализовывать так много видов конкретных поведенческих классов, как swimbehaviour, nullbehaviour и т. д., но выхода из этого нет.
Есть ли способ сделать это в шаблонах проектирования? Это почти похоже на гибрид шаблонов.
Я знаю, что кажется, что если он ходит, как утка, и крякает, как утка, но требует батареи, тогда у вас что-то не так с абстракцией.
Надеюсь, это имеет смысл.