第五种:继承与多态
假设你正在开发一个电子商务平台,需要处理不同类型的订单,例如普通订单和折扣订单。每种订单都有一些共同的属性(如订单号、购买商品列表)和方法(如计算总价、生成订单报告),但折扣订单还有特定的属性和方法。
在没有使用继承和多态的话,会写出类似这样的代码:
//普通订单 public class Order { private String orderNumber; private List<Product> products; public Order(String orderNumber, List<Product> products) { this.orderNumber = orderNumber; this.products = products; } public double calculateTotalPrice() { double total = 0; for (Product product : products) { total += product.getPrice(); } return total; } public String generateOrderReport() { return "Order Report for " + orderNumber + ": Total Price = $" + calculateTotalPrice(); } } //折扣订单 public class DiscountOrder { private String orderNumber; private List<Product> products; private double discountPercentage; public DiscountOrder(String orderNumber, List<Product> products, double discountPercentage) { this.orderNumber = orderNumber; this.products = products; this.discountPercentage = discountPercentage; } public double calculateTotalPrice() { double total = 0; for (Product product : products) { total += product.getPrice(); } return total - (total * discountPercentage / 100); } public String generateOrderReport() { return "Order Report for " + orderNumber + ": Total Price = $" + calculateTotalPrice(); } }
显然,看到在Order
和DiscountOrder
类中,generateOrderReport()
方法的代码是完全相同的。calculateTotalPrice()
则是有一点点区别,但也大相径庭。
我们可以使用继承和多态去除重复代码,让DiscountOrder
去继承Order
,代码如下:
public class Order { private String orderNumber; private List<Product> products; public Order(String orderNumber, List<Product> products) { this.orderNumber = orderNumber; this.products = products; } public double calculateTotalPrice() { double total = 0; for (Product product : products) { total += product.getPrice(); } return total; } public String generateOrderReport() { return "Order Report for " + orderNumber + ": Total Price = $" + calculateTotalPrice(); } } public class DiscountOrder extends Order { private double discountPercentage; public DiscountOrder(String orderNumber, List<Product> products, double discountPercentage) { super(orderNumber, products); this.discountPercentage = discountPercentage; } @Override public double calculateTotalPrice() { double total = super.calculateTotalPrice(); return total - (total * discountPercentage / 100); } }
第六种:使用设计模式
很多设计模式可以减少重复代码、提高代码的可读性、可扩展性.比如:
-
工厂模式: 通过工厂模式,你可以将对象的创建和使用分开,从而减少重复的创建代码。 -
策略模式: 策略模式定义了一族算法,将它们封装成独立的类,并使它们可以互相替换。通过使用策略模式,你可以减少在代码中重复使用相同的逻辑。 -
模板方法模式:模板方法模式定义了一个算法的骨架,将一些步骤延迟到子类中实现。这有助于避免在不同类中重复编写相似的代码。
我给大家举个例子,模板方法是如何去除重复代码的吧,业务场景:
文章评论