一个天真且难以测试的方法实现可能如下所示
public void getFromDatabaseComputeAndStore(SomeType param) {
Collection<Something> s = dao.retrieveSomethingFromDatabase(param);
Collection<Other> o = dao.retrieveOtherFromDatabase(param);
Result r = null;
<do massive computation, call other methods, figure out what r should be>
<based on s and o>
dao.store(r);
}
通常我会将其重构为类似
的内容public void getFromDatabaseComputeAndStore(SomeType param) {
Computer computer = new Computer();
Collection<Something> s = dao.retrieveFromDatabase(param);
Collection<Other> o = dao.retrieveOtherFromDatabase(param);
computer.setSomething(s);
computer.setOther(o);
computer.execute();
Result r = computer.getResult();
dao.store(r);
}
Computer
类是关键。此类不与数据库或其他外部系统交互,也没有副作用,例如它纯粹是功能性的。给定相同的somethings
和others
,result
将始终相同。
所以我的问题是:
Computer
我查看了Strategy
,Mediator
和Command
模式,但我觉得它们并不完美。
答案 0 :(得分:0)
您的计算机是构建器的一种形式。
Builder的一个用途是允许对对象的复杂构造进行封装,使得构建器的客户端永远不能访问部分构造的或无效的对象。您配置Builder,然后从中获取已完成的对象。
请注意,GoF有一个包含多态结果的构建器示例。这种用法也很常见,但我不认为这是严格要求的。
.NET和Java在其框架中有两个用法的充分示例。