我正在阅读有关Spring的文章,并遇到了一个包含名称和价格字段的抽象产品类的示例.
接下来,有一个Battery类,它扩展了Product类并添加了一个可充值字段.然后,CDDrive类(也)扩展Product但添加容量字段.
在现实世界中,当我们经常拥有具有许多不同属性的产品时,如何模拟具有任意属性和字段的任意产品?
每个产品的课程有意义吗?
所以,你们可以提出一个实现这个目标的模式吗?
谢谢,
Ouney
解决方法:
好问题.在我们拥有共享许多抽象父级的GUI组件之前,我们遇到了类似的情况,但每个页面都有自己的一组标签,这些标签没有被其他人共享.对峙正在进行中.我们发现继续创建子类因为它们具有相互不相交的属性而感到愚蠢.它对我们来说是地图.首先,要使子类具有一个或多个作为第一类对象的区别属性.在您的情况下可充电电池和CD驱动器的容量.然后,对于在构建时无法想到的属性,或者只是在次要命名约定上有所不同,请使用地图.我用下面的例子演示.
产品:
public abstract class Product {
String name;
Double price;
Map propMap;
public Product(String name, Double price) {
this.name = name;
this.price = price;
propMap = new HashMap<>();
}
public void add2propMap(String key, Object value) {
propMap.put(key, value);
}
public String toString() {
return "Product [name=" + name + ", price=" + price + ", propMap=" + propMap + "]";
}
}
CdDrive:
public class CdDrive extends Product {
String capacity;
public CdDrive(String name, Double price, String capacity) {
super(name, price);
this.capacity = capacity;
}
}
电池:
public class Battery extends Product {
Boolean rechargable;
public Battery(String name, Double price, Boolean rechargable) {
super(name, price);
this.rechargable = rechargable;
}
}
然后客户:
public class Client {
public static void main(String[] args) {
List productList = new ArrayList<>();
Battery energizer = new Battery("Energizer", 12d, true);
energizer.add2propMap("numInPackage", new Integer(8));
energizer.add2propMap("make", "US");
productList.add(energizer);
CdDrive superDrive = new CdDrive("Apple Drive", 200d, "200 GB");
superDrive.add2propMap("type", "External");
superDrive.add2propMap("expandable", false);
productList.add(superDrive);
productList.forEach(p -> System.out.println(p));
}
}
运行时给出了这个:
Product [name=Energizer, price=12.0, propMap={numInPackage=8, make=US}]
Product [name=Apple Drive, price=200.0, propMap={expandable=false, type=External}]
此设置使架构可扩展,可维护和可修改.如果有疑问,地图键总是报告那里的内容.添加很容易,因此正在修改.
标签:java,design-patterns
来源: https://codeday.me/bug/20190628/1316992.html