Oun*_*ney 5 java design-patterns
name我在阅读有关 Spring 的内容时遇到了一个由带有和字段的抽象产品类组成的示例price。
接下来,有一个Battery类扩展了该类Product并添加了一个rechargable字段。然后,一个CDDrive类(也)扩展Product但添加一个capacity字段。
在现实世界中,当我们经常拥有具有许多不同属性的产品时,如何对具有任意属性和字段的任意产品进行建模?为每个产品设置一个类是否有意义?
那么,你们能建议一种实现这一目标的模式吗?
谢谢,欧尼
好问题。我们之前遇到过类似的情况,我们的 GUI 组件共享许多抽象父级,但每个页面都有自己的一组标签,不与其他页面共享。对峙开始了。我们发现继续创建子类是愚蠢的,因为它们具有相互不相交的属性。地图对我们有帮助。首先,拥有子类就是拥有一个或多个作为第一类对象的区别属性。可充电电池和 CD 驱动器容量。然后,对于在构建时无法想到的属性,或者只是在较小的命名约定上有所不同,请使用映射。我用下面的例子来演示。
产品:
public abstract class Product {
String name;
Double price;
Map<String, Object> 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 + "]";
}
}
Run Code Online (Sandbox Code Playgroud)
CD驱动器:
public class CdDrive extends Product {
String capacity;
public CdDrive(String name, Double price, String capacity) {
super(name, price);
this.capacity = capacity;
}
Run Code Online (Sandbox Code Playgroud)
}
电池:
public class Battery extends Product {
Boolean rechargable;
public Battery(String name, Double price, Boolean rechargable) {
super(name, price);
this.rechargable = rechargable;
}
Run Code Online (Sandbox Code Playgroud)
}
然后是一个客户:
public class Client {
public static void main(String[] args) {
List<Product> 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));
}
Run Code Online (Sandbox Code Playgroud)
}
运行时给出以下结果:
Product [name=Energizer, price=12.0, propMap={numInPackage=8, make=US}]
Product [name=Apple Drive, price=200.0, propMap={expandable=false, type=External}]
Run Code Online (Sandbox Code Playgroud)
这种设置使得架构可扩展、可维护和可修改。地图键总是报告那里有什么,以防有疑问。添加很容易,修改也很容易。