例如说你有一个基础抽象类
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 上实现接口虽然这让你实现了这么多种具体的行为类,比如游泳行为、空行为等,但没有办法摆脱它。
有没有办法在设计模式中做到这一点?它几乎看起来像是一种混合模式。
我知道,如果它像鸭子一样走路,像鸭子一样嘎嘎叫,但需要电池,那么你的抽象就有问题了。
希望这是有道理的。