类的设计
Product
类:作为基类,包含商品通用属性和方法。
public class Product {
private int id;
private String name;
private double price;
public Product(int id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public String getDetails() {
return "ID: " + id + ", Name: " + name + ", Price: " + price;
}
}
DigitalProduct
类:继承自Product
,添加downloadLink
属性和download
方法。
public class DigitalProduct extends Product {
private String downloadLink;
public DigitalProduct(int id, String name, double price, String downloadLink) {
super(id, name, price);
this.downloadLink = downloadLink;
}
public String getDownloadLink() {
return downloadLink;
}
public void download() {
System.out.println("Downloading product from: " + downloadLink);
}
}
PhysicalProduct
类:继承自Product
,添加weight
属性和calculateShipping
方法。
public class PhysicalProduct extends Product {
private double weight;
public PhysicalProduct(int id, String name, double price, double weight) {
super(id, name, price);
this.weight = weight;
}
public double getWeight() {
return weight;
}
public double calculateShipping() {
// 简单示例,实际根据业务计算
return weight * 0.1;
}
}
处理类之间的依赖关系
- 依赖倒置原则:尽量依赖抽象(如接口或抽象类)而不是具体实现。例如,如果有模块需要处理商品,可定义一个接口
ProductService
,不同商品类型实现该接口,这样模块依赖接口而非具体的DigitalProduct
或PhysicalProduct
类。
public interface ProductService {
String getProductInfo();
}
public class DigitalProductService implements ProductService {
private DigitalProduct digitalProduct;
public DigitalProductService(DigitalProduct digitalProduct) {
this.digitalProduct = digitalProduct;
}
@Override
public String getProductInfo() {
return digitalProduct.getDetails() + ", Download Link: " + digitalProduct.getDownloadLink();
}
}
public class PhysicalProductService implements ProductService {
private PhysicalProduct physicalProduct;
public PhysicalProductService(PhysicalProduct physicalProduct) {
this.physicalProduct = physicalProduct;
}
@Override
public String getProductInfo() {
return physicalProduct.getDetails() + ", Weight: " + physicalProduct.getWeight() + ", Shipping Cost: " + physicalProduct.calculateShipping();
}
}
- 控制反转(IoC)/依赖注入(DI):使用框架(如Spring)来管理对象的创建和依赖关系。这样可以通过配置文件或注解来注入依赖,而不是在类内部直接创建对象,提高可测试性和可维护性。
数据一致性问题
- 数据库事务:如果商品信息存储在数据库中,使用数据库事务来确保数据一致性。例如,在更新商品价格时,如果涉及到多个相关表(如库存表等)的修改,将这些操作放在一个事务中,要么全部成功,要么全部回滚。
- 数据验证:在设置商品属性时进行严格的数据验证。比如,价格不能为负数,重量必须为正数等。在构造函数或Setter方法中添加验证逻辑。
public class Product {
//...
public void setPrice(double price) {
if (price < 0) {
throw new IllegalArgumentException("Price cannot be negative");
}
this.price = price;
}
//...
}
- 版本控制:对于商品信息的修改,可以使用版本控制机制。每次修改商品信息时,版本号递增。在读取数据时,可以根据版本号来判断数据是否是最新的,避免脏读等问题。