1) модельный домен, управляемый способом проектирования
Вы могли бы сделать вещи намного проще, сделав ваши доменные объекты с поведением.
Например, вы можете объединить Акция и оценку Акции в одном классе.
Анемичные объекты не обязательно являются лучшей вещью.
Например:
class FixedPricePromotion extends AbstractPromotion{
String product;
Double price;
public void evaluate(Cart cart){
for(String product : cart.getProducts()){
if(product.equal(product)){
//some code to discount y price
}
}
}
}
Акция PromotionService теперь может быть изменена следующим образом:
class PromotionService {
void evaluation(Cart cart){
for(AbstractPromotion p : getPromotions){
p.evaluate(cart);
}
}
}
2) область модели и логический разделенный путь
Если вы не хотите объединять их, вы можете соединить их благодаря полевой зависимости от одного к другому.
PromotionEvaluation
может быть интерфейсом, который определяет шаблон логики и абстрактный метод isMatch()
и applyPromotion()
для определения в подклассах:
public interface PromotionEvaluation{
boolean isMatch(String product);
void applyPromotion(String product);
default void evaluate(Cart cart){
for(String product : cart.getProducts()){
if(isMatch(product)){
applyPromotion(product);
}
}
}
}
И подкласс может быть таким:
class FixedPricePromotionEvaluation implements PromotionEvaluation{
FixedPricePromotion promotion;
public FixedPricePromotionEvaluation(FixedPricePromotion promotion){
this.promotion = promotion;
}
public boolean isMatch(String product){
return product.equal(promotion.product)
}
public void applyPromotion(String product){
// do your logic
}
}
Теперь вы можете повторять оценки следующим образом:
class PromotionService {
void evaluation(Cart cart){
for(PromotionEvaluation evaluation : getEvaluations()){
e.evaluate(cart);
}
}
}