基于枚举值设置对象中某些字段的设计模式。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于枚举值设置对象中某些字段的设计模式。相关的知识,希望对你有一定的参考价值。

所以基本上我想做的是,根据一个枚举列表来填充而不是填充对象中的某些字段。

比如说这个对象。

case class Car(brand: String,
              model: String,
              wheels: Int,
              airbags: Boolean,
              seats: Int,
               cruiseControl: Boolean,
               photo: String,
               parkingAssist: Boolean)

这是一个完整的对象, 根据Java枚举类型的列表 我想设置某些字段. 此外,组合也是可能的,它们可能会重叠。

enum CarType {
  BASIC_CAR,
  LUXURY_CAR,
  SAFE_CAR,
  PICTURE_CAR
}

所以基本上根据CarType,我想设置Car的某些字段。例如:BASIC_CAR需要设置品牌。

BASIC_CAR需要设置品牌,型号,轮子和座位。

LUXURY_CAR需要设置品牌,车型,巡航控制和停车辅助系统。

SAFE_CAR需要设置安全气囊

PICTURE_CAR需要设置停车辅助功能。

所以我将收到这些枚举的列表,然后需要创建对象。例如,我将有一个对象,其中包括BASIC_CAR, LUXURY_CAR, SAFE_CAR,这意味着我创建的对象将必须拥有除parkingAssist之外的所有字段。

所以最后,枚举与某些字段有关,基本上我需要在对象中设置某些字段的(组合)枚举。这样的设计有什么好处呢?

答案

我认为你应该使用Decorator模式来解决这个问题.看看这个网站就能得到一个例子。https:/sourcemaking.comdesign_patternsdecorator

我编辑了我的帖子,以便更加具体,我的意思是这样的。

public interface Car {

    public void assemble();
}

public class BasicCar implements Car {

    @Override
    public void assemble() {
        //set basic car:  brand, model, wheels and seats.
    }

}

public class CarDecorator implements Car {

    protected Car car;

    public CarDecorator(Car c){
        this.car=c;
    }

    @Override
    public void assemble() {
        this.car.assemble();
    }

}

public class LuxuryCar extends CarDecorator {

    public LuxuryCar(Car c) {
        super(c);
    }

    @Override
    public void assemble(){
        super.assemble();
        //add especial fields for luxury car or override values from basic car
    }
}

根据Enum值的不同,你可以创建不同的类:new LuxuryCar(),new SportCar()

以上是关于基于枚举值设置对象中某些字段的设计模式。的主要内容,如果未能解决你的问题,请参考以下文章

如何运用领域驱动设计 - 值对象

ObjectMapper如果某些字段无法转换为对象的默认值

获取枚举值[重复]

MongoDB - 基于嵌套数组的字段值更新数组对象中的字段

根据GSON中的值从序列化中排除某些字段

四.Protobuf3 缺省值