让我们说我们必须检索类的数据:贸易。这个交易类有很多参数,比如A,B,C ....
class A { retrieveTradeDataWithA(); and many more methods which do something }
class B { retrieveTradeDataWithB(); and many more methods which do something }
class LetsSaySomeResource {
@Inject
private A classAInstance;
@Inject
private B classBInstance;
public void getTradeDataBasedOnA(){
classAInstance.retrieveTradeDataWithA();
}
public void getTradeDataBasedOnB(){
classBInstance.retrieveTradeDataWithB();
}
}
现在要求我们想要基于A和B两者获取一些交易数据,之后可能会添加更多的类,如A和B,以便根据此获取数据。如何使设计更灵活?
像,
public void getDataBasedOnAandB(){
}
或者,以后C类可以来,所以我不想继续注入像A,B这样的过滤器.... 有人可以为此提供帮助吗?
答案 0 :(得分:4)
首先创建一个界面来定义做某事的合同:
public interface IData {
void doSomething();
}
然后创建具体的实现来做某事:
public class DataA implements IData {
@Override
public void doSomething() {
// TODO Do something for A
}
}
public class DataB implements IData {
@Override
public void doSomething() {
// TODO Do something for B
}
}
最后一个实际上会做某事的课程:
public class DataDAO {
private List<IData> dataList;
public DataDAO(List<IData> dataList) {
this.dataList = dataList;
}
public void doSomething() {
for(IData data : dataList) {
data.doSomething();
}
}
}
现在让我们来看看你的用例:
为A做点什么:
List<IData> dataAList = new ArrayList<IData>();
dataList.add(new DataA());
DataDAO dataADAO = new DataDAO(dataAList);
dataADAO.doSomething();
为A和B做点什么:
List<IData> dataAList = new ArrayList<IData>();
dataList.add(new DataA());
dataList.add(new DataB());
DataDAO dataADAO = new DataDAO(dataAList);
dataADAO.doSomething();
答案 1 :(得分:1)
看起来像这样:
class LetsSaySomeResource {
@Resource
private Map<String, DataAccessInterface> instanceToDataAccessMapping;
public DateAggregationResult getDataFor(String... instanceNames) {
DataAggregationResult result = new DataAggregationResult(); // some list or whatever
for (String instanceName : instanceNames) {
Data data = instanceToDataAccessMapping.get(instanceName).getData();
/**
* Add this data to aggregation result here
*/
}
return result;
}
}
答案 2 :(得分:0)
尝试decorator pattern之类的内容。如果您的课程将随着时间的推移而增长,总是基于以前的要求,您可以通过装饰来添加额外的计算。
您的示例仍然非常抽象,因此很难判断您的其他课程是相互依赖还是简单地扩展&#34; (简单的继承可以)。
或者完全解耦,所以像SimY4这样的东西可以提供帮助(例如使用visitor pattern的变体)。
答案 3 :(得分:0)
我认为模板设计模式在这里很有用。 http://en.wikipedia.org/wiki/Template_method_pattern
您可以在基类中定义模板方法,并让实现此类的子类定义自己的算法来执行此操作。请阅读wiki链接,然后找到出路。