Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Which design pattern to apply

Lets say we have to retrive data of class: Trade. This trade class has many parameters like 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();
  }
}

Now the requirement is we want to fetch some trade data based on A and B both and later on maybe more classes like A and B will be added to get data based on this. How shall i make the design more flexible?

Like,

public void getDataBasedOnAandB(){
}

Or, later on C class can come, so i dont want to keep injecting filters like A,B.... Can someone help on this?

like image 816
bhupen Avatar asked Mar 23 '26 10:03

bhupen


2 Answers

First create an interface that will define the contract for doing something :

public interface IData {
    void doSomething();
}

Then create the concrete implementations to do something :

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
    }

}

And finally a class that will actually do something :

public class DataDAO {
    private List<IData> dataList;

    public DataDAO(List<IData> dataList) {
        this.dataList = dataList;
    }

    public void doSomething() {
        for(IData data : dataList) {
            data.doSomething();
        }
    }
}

Now let's take your use cases :

do something for A :

 List<IData> dataAList = new ArrayList<IData>();
 dataList.add(new DataA());
 DataDAO dataADAO = new DataDAO(dataAList);
 dataADAO.doSomething();

do something for A and B :

 List<IData> dataAList = new ArrayList<IData>();
 dataList.add(new DataA());
 dataList.add(new DataB());
 DataDAO dataADAO = new DataDAO(dataAList);
 dataADAO.doSomething();
like image 142
Chetan Kinger Avatar answered Mar 24 '26 23:03

Chetan Kinger


It may look something like this:

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;
    }
}
like image 37
SimY4 Avatar answered Mar 25 '26 01:03

SimY4



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!