为了账号安全,请及时绑定邮箱和手机立即绑定

将域对象与业务逻辑耦合

将域对象与业务逻辑耦合

犯罪嫌疑人X 2022-07-20 10:50:08
假设我们有一个领域对象和这个对象的评估类。例如,在单独的类中的促销及其评估逻辑: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 原则来耦合这些对。
查看完整描述

1 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

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);

        }

    }

}


查看完整回答
反对 回复 2022-07-20
  • 1 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信