应用哪种设计模式

时间:2015-01-26 06:55:23

标签: java design-patterns

让我们说我们必须检索类的数据:贸易。这个交易类有很多参数,比如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这样的过滤器.... 有人可以为此提供帮助吗?

4 个答案:

答案 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链接,然后找到出路。