我正在尝试为扑克手历史编写一个解析器系统。有些会使用正则表达式,有些会使用 XML,等等……
目前我有这个:
abstract class Parser {
abstract protected GameContext findGameContext();
public void parse() {
GameContext gameContext = findGameContext();
}
}
和:
class RegexParser {
protected GameContext findGameContext() {
// find game context by using some regex...
}
}
我对此很满意。如果我想要另一种解析器,我将 Parser 子类化并实现抽象方法。
但是,我知道我可以使用依赖注入来做同样的事情。
像这样的东西:
class Parser {
private IDataType<GameContext> gameContextFinder;
public setGameContextFinder(IDataTypeFinder<GameContext> finder) { this... = ... }
public parse() {
GameContext gameContext = this.GameContextFinder.find();
...
}
在哪里:
interface IDataTypeFinder<T> {
public T find();
}
class GameContextFinder implements IDataTypeFinder {
public GameContext find() {
// some regex...
}
}
和:
class RegexParser extends Parser {
public RegexParser() {
this.setGameContextFinder( new GameContextFinder() );
}
}
你怎么看这两种方式?到目前为止,我发现 DI 对单元测试很有用。但是抽象继承感觉更“自然”……