【发布时间】:2010-10-07 07:03:23
【问题描述】:
比如说你有一个基础抽象类
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 上,虽然这会让你实现这么多种具体行为类,如游泳行为、空行为等,但没有办法摆脱它。
在设计模式中有没有办法做到这一点?它几乎看起来像是一种混合模式。
我知道,如果它像鸭子一样走路和像鸭子一样嘎嘎叫,但需要电池,那么你的抽象就有问题了。
希望这是有道理的。
【问题讨论】:
-
Arg!骆驼案例的方法?成员的下划线前缀!?!是的,这是一个无益的评论,但我就是忍不住;)
标签: c# oop design-patterns decorator strategy-pattern