我的问题基本上是,如果我们从一个来源检索相同的数据,有时从其他来源检索相同的数据,那么应该使用的理想设计模式是什么。原因来自多个源,因为当您计划从一个数据库移动到另一个数据库时,一个数据库希望将原始源的数据保留一段时间,直到第二个数据库变得稳定。因此,我们需要维护两种检索数据的方法,然后在这两种情况下相应地格式化数据。
代理将是一种合理的方法 - 根据您的情况而定;但我必须强调,从来没有真正的“理想方法”。不同的设计有不同的优点和缺点。有时一种方法对您有用,有时则完全没有意义。因此,以下只是我了解您的情况后我会遵循的一种可能的方法。
我们有两个问题 - 可以用两个问题来表达:我们如何从源获取数据?我们如何决定从哪个来源获取数据?
首先让我们使用接口抽象实际数据;它将定义管理和访问数据的所有方法:
public interface Data
{
// methods for administrating the data
}
Run Code Online (Sandbox Code Playgroud)
让我们使用抽象来从源获取数据。为此我们声明一个接口:
public interface DataRetriever
{
Data retrieveData();
}
Run Code Online (Sandbox Code Playgroud)
我们将有两个对象实现该接口,一个分别用于源 a,一个用于源 b。毕竟,客户端并不关心数据是如何获取的——客户端只关心数据是如何获取的:
public class RetrieverA implements DataRetriever
{
@Override
public Data retrieveData()
{
//handle obtaining the data
}
}
public class RetrieverB implements DataRetriever
{
@Override
public Data retrieveData()
{
// handle obtaining the data
}
}
Run Code Online (Sandbox Code Playgroud)
RetrieverA 和 RetrieverB 实现 DataRetriever 接口,并将实现获取数据的实际代码。接下来让我们定义实际的代理。代理将实现 DataRetriever 接口并存储对 RetrieverA 和 RetrieverB 的引用:
public class Proxy implements DataRetriever
{
private final RetrieverA;
private final RetrieverB;
@Override
public Data retrieveData()
{
// insert logic for deciding which source to get the data from
}
}
Run Code Online (Sandbox Code Playgroud)
retrieveData() 方法实际上定义了何时从哪个 DataRetriever 检索哪些数据的逻辑。客户将获得数据并可以随意使用它。
我希望我能最全面地回答你的问题。我建议您阅读《四人帮》这本书,如果您还没有的话(这也是我的来源):
http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented-ebook/dp/B000SEIBB8
或者,有一个网站简要描述了大多数模式: