简化涉及条件的代码的一种很好的 OO 方法是通过策略模式 (http://en.wikipedia.org/wiki/Strategy_pattern) 替换它们。您可以在此处找到有关此特定重构的一些信息:http: //www.industriallogic.com/xp/refactoring/conditionalWithStrategy.html。
基本思想是用策略封装每个条件案例的逻辑,然后委托给策略实例。这会产生比嵌套 if/then/else 或 switch 语句更清晰的代码。
为了说明这一点,假设您有一个复杂的条件逻辑,例如:
Entity e = // some entity
if ("TypeOne".equals(e.getType()) {
// process entity of type one...
} else if ("TypeTwo".equals(e.getType()) {
// process entity of type two...
} else if ("TypeThree".equals(e.getType()) {
// process entity of type three...
} else {
// default processing logic
}
我们可以使用策略模式将其分解为不同的实体处理策略,而不是按程序编写这段逻辑。首先,我们需要定义一个接口,该接口将从所有实体处理策略中共享:
public interface EntityProcessingStrategy {
public void process(Entity e);
}
然后我们为我们的每一个条件案例创建一个具体的策略实现,封装了具体的处理逻辑:
public class TypeOneEntityProcessingStrategy {
public void process(Entity e) {
// process entity of type one...
}
}
public class TypeTwoEntityProcessingStrategy {
public void process(Entity e) {
// process entity of type two...
}
}
public class TypeThreeEntityProcessingStrategy {
public void process(Entity e) {
// process entity of type three...
}
}
public class DefaultEntityProcessingStrategy {
public void process(Entity e) {
// default entity processing logic...
}
}
因此,我们之前的代码可以简化为删除条件,如下所示:
Entity e = // our entity that needs to be processed
EntityProcessingStrategy strategy = EntityProcessingStrategies.getStrategyFor(e.getType);
strategy.process(e);
请注意,在我的最后一个示例中,我包含了一个 EntityProcessingStrategies 类,该类用作具体策略的工厂。更具体地说,它可以是:
public final class EntityProcessingStrategies {
private EntityProcessingStrategies() { }
public EntityProcessingStrategy getStrategyFor(String type) {
if ("TypeOne".equals(type)) return new TypeOneEntityProcessingStrategy();
if ("TypeTwo".equals(type)) return new TypeTwoEntityProcessingStrategy();
if ("TypeThree".equals(type)) return new TypeThreeEntityProcessingStrategy();
return new DefaultEntityProcessingStrategy();
}
}
这是创建具体策略实例的一种方法,但绝不是唯一的方法。