繁体   English   中英

为对象合成选择正确的模式

[英]choosing the right pattern for object composite

有一个名为“ Bill”的类。 Bill可以是“电力”,“食品”或“客户”,它们都是POJO。 因此它包含三个对象:

    public class Bill{
      private Electricity el1;
      private Food el2;
      private Customer el3;
      //setters and getters
      public setElectricity(...)
      ...
    }

使用某些DTO填充票据清单。 每次,我都需要检查所有要素,以确保我拥有哪种类型的账单。

我的目标是重构此设计。

我也可以有一个对象并为类型设置内容,但是它具有任何标准模式吗?

对于可以根据所请求的类型作为类的类,是否有任何模式可供使用? 我的意思是,就人口稠密的时间而言,比尔将是电力,食品或客户。

注意:我的应用程序偏向于继承而不是继承。它也是基于“合约设计”的应用程序。

编辑:比尔不是它的对象的摘要。 假设食物只是颜色和收据等食物的规格! 在某个时间点,账单可以是一个对象,也可以只是一个对象。

Bill是一个抽象实体,因此它应该是一个abstract类。 所有其他类型的账单都应从中扩展,例如: ElectricityBillFoodBillGasBill

如果ElectricityBill,FoodBill,GasBill具有某些通用功能,则将Bill创建为抽象类,并从bill扩展其他类。

如果它们的行为和状态完全不同(我怀疑),则创建Bill作为接口,并让其他具体类实现它们。

我通常将其称为简单工厂模式(不要将其与工厂方法/抽象工厂模式混淆)

public class BillFactory
{
    Bill createBill(String type)
    {
         if(type.equals("Electricity"))
           {
            bill=new ElectricityBill();
       }
        ........


    }
}

由于您有一个带有许多参数的大对象,其中一些参数是可选的。

您可以使用“ 构建器模式”来创建Bill类的实例。

与旨在实现多态性的抽象工厂模式和工厂方法模式不同,构建器模式的目的是为伸缩构造函数反模式找到解决方案。 当对象构造函数参数组合的增加导致构造函数的指数列表出现时,将发生伸缩构造函数反模式。 生成器模式没有使用多个构造函数,而是使用另一个对象(一个生成器),该对象逐步接收每个初始化参数,然后立即返回生成的构造对象。

假设您要盖房子:

public House getHouse() {
    return this.houseBuilder.getHouse();
  }

  public void constructHouse() {
    this.houseBuilder.buildBasement();
    this.houseBuilder.buildStructure();
    this.houseBuilder.bulidRoof();
    this.houseBuilder.buildInterior();
  }

Java论文示例

如果Bill只可以包含一个实例,为什么不使用界面呢?

    public interface Billable {

        double getPrize();
    }

    public class Electricity implements Billable {

        @Override
        public double getPrize() {
            return 20.0;
        }
    }

    public class Bill {

        /**
         * Billable to bill.
         */
        Billable billable;
        /*
         * Discount percent applied to bill.
         */
        @Min(0)
        @Max(100)
        double discount;
        /**
         * VAT percent applied to bill.
         */
        @Min(0)
        @Max(100)
        double vat;

        public Bill(@NotNull Billable billable) {
            this.billable = billable;
            discount = 10.0;
            vat = 21.0;
        }


        public double getFinalPrize() {
            double discountFactor = 1 - discount / 100;
            double vatFactor = 1 + vat / 100;
            return billable.getPrize() * discountFactor * vatFactor;
        }

        public static void main(String[] args) {
            Electricity electricity = new Electricity();
            Bill electricityBill = new Bill(electricity);
            System.out.println(electricityBill.getFinalPrize());

        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM