将域对象与业务逻辑耦合

假设我们有一个领域对象和这个对象的评估类。例如,在单独的类中的促销及其评估逻辑:


class BuyXGetYFreePromotion extends AbstractPromotion{

   String x;

   String y;

}


class BuyXGetYFreePromotionEvaluation {

   public void evaluate(Cart cart){

       for(String product : cart.getProducts()){

           if(product.equal(BuyXGetYFreePromotion.x)){

              //some code to discount y price

           }

       }

   }

}

另一个例子:


class FixedPricePromotion extends AbstractPromotion{

    String product;

    Double price;

}


class FixedPricePromotionEvaluation {

    public void evaluate(Cart cart){

        for(String product : cart.getProducts()){

           if(product.equal(FixedPricePromotion.product)){

              //some code to discount y price

           }

        }

    }

}

我们有很多这样的对子。


我们不能在域对象中注入评估,但我们可以将它们关联到评估类或其他类中。


第一个选项是将它们与 instanceof 语句相关联。


例如:


class PromotionService {

    void evaluation(Cart cart){

        for(AbstractPromotion p : getPromotions){

            if(p instanceof BuyXGetYFreePromotion)

               BuyXGetYFreePromotionEvaluation.evaluate(cart);

            else if(p instanceof FixedPricePromotion)

               FixedPricePromotionEvaluation.evaluate(cart);

        }

    }

}

但是这个例子违反了开闭原则。


我的问题是,我应该如何通过考虑 SOLID 原则来耦合这些对。


犯罪嫌疑人X
浏览 123回答 1
1回答

紫衣仙女

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);        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java