【发布时间】:2010-04-11 21:12:00
【问题描述】:
拥有大量只做一件事的“工作”类(例如策略类)是不是很糟糕?
假设我想创建一个 Monster 类。我不只是在一个类中定义我想要的关于怪物的所有内容,而是尝试确定它的主要特征是什么,以便我可以在接口中定义它们。这将允许:
- 如果我愿意,请密封班级。稍后,其他用户可以通过我定义的接口创建一个新类,并且仍然具有多态性。我不必担心人们(或我自己)将来可能希望如何更改/向基类添加功能。所有类都从 Object 继承,它们通过接口实现继承,而不是从母类。
- 将我对这个怪物使用的策略重用于我游戏世界的其他成员。
缺点:这个模型是刚性的。有时我们想定义一些仅仅通过尝试将这些“构建块”组合在一起并不容易实现的东西。
public class AlienMonster : IWalk, IRun, ISwim, IGrowl {
IWalkStrategy _walkStrategy;
IRunStrategy _runStrategy;
ISwimStrategy _swimStrategy;
IGrowlStrategy _growlStrategy;
public Monster() {
_walkStrategy = new FourFootWalkStrategy();
...etc
}
public void Walk() { _walkStrategy.Walk(); }
...etc
}
接下来我的想法是制定一系列不同的策略,供不同的怪物使用。另一方面,它们中的一些也可以用于完全不同的目的(即,我可以有一个也“游泳”的坦克)。我看到这种方法的唯一问题是它可能导致纯“方法”类的爆炸式增长,即仅具有执行此或其他操作的目的的策略类。另一方面,这种“模块化”将允许策略的高度重用,有时甚至在完全不同的环境中也是如此。
您对此事有何看法?这是一个有效的推理吗?这是过度设计吗?
另外,假设我们对我上面给出的示例进行了适当的调整,将 IWalk 定义为:
interface IWalk {
void Walk();
}
或
interface IWalk {
IWalkStrategy WalkStrategy { get; set; } //or something that ressembles this
}
因为这样做我不需要在 Monster 本身上定义方法,我只需要 IWalkStrategy 的公共 getter(这似乎违背了你应该尽可能多地封装所有东西的想法!) 为什么?
谢谢
【问题讨论】:
标签: c# design-patterns oop