面试题答案
一键面试1. 策略模式中Java多态实现通用代码编写
在策略模式中,首先定义一个策略接口,该接口声明了一系列相关行为的方法。例如,假设有一个计算折扣的策略模式,定义策略接口如下:
public interface DiscountStrategy {
double calculateDiscount(double price);
}
然后创建具体的策略类实现这个接口,如:
public class PercentageDiscountStrategy implements DiscountStrategy {
private double percentage;
public PercentageDiscountStrategy(double percentage) {
this.percentage = percentage;
}
@Override
public double calculateDiscount(double price) {
return price * (1 - percentage);
}
}
public class FixedAmountDiscountStrategy implements DiscountStrategy {
private double fixedAmount;
public FixedAmountDiscountStrategy(double fixedAmount) {
this.fixedAmount = fixedAmount;
}
@Override
public double calculateDiscount(double price) {
return price - fixedAmount;
}
}
在使用策略模式的上下文类中,通过多态实现通用代码编写:
public class ShoppingCart {
private DiscountStrategy discountStrategy;
public ShoppingCart(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public double checkout(double totalPrice) {
return discountStrategy.calculateDiscount(totalPrice);
}
}
这里,ShoppingCart
类并不关心具体使用哪种折扣策略,只依赖于 DiscountStrategy
接口。这使得 ShoppingCart
类的代码可以通用,无论将来添加何种新的折扣策略,ShoppingCart
类都无需修改。
2. 不同策略类之间的多态关系
不同的策略类(如 PercentageDiscountStrategy
和 FixedAmountDiscountStrategy
)都实现了同一个策略接口 DiscountStrategy
。它们之间的多态关系体现在:在运行时,根据实际传入的具体策略类对象,ShoppingCart
类中的 discountStrategy
接口引用可以指向不同的具体策略类实例,从而调用不同的 calculateDiscount
实现。这种关系允许在不修改现有代码结构的情况下,灵活地切换和扩展策略。
3. 实际应用中通过多态优化代码实现通用架构
- 可维护性:当需要修改某种折扣计算逻辑时,只需要修改对应的具体策略类,不会影响其他策略类和上下文类。例如,如果要调整百分比折扣的计算方式,只在
PercentageDiscountStrategy
类中修改calculateDiscount
方法即可。 - 可扩展性:添加新的折扣策略非常容易。只需创建一个新的类实现
DiscountStrategy
接口,并在需要使用的地方传入该新策略类的实例。例如,添加一个买一送一的折扣策略,创建BuyOneGetOneFreeDiscountStrategy
类实现DiscountStrategy
接口,然后在ShoppingCart
实例化时传入该新策略对象。
4. 大型项目中使用多态编写通用代码面临的挑战及解决方案
- 挑战:
- 类数量膨胀:随着策略的不断增加,具体策略类的数量可能会变得庞大,导致代码管理和维护困难。
- 策略选择复杂:在大型项目中,如何根据不同的业务场景正确选择合适的策略可能变得复杂,尤其是当策略之间存在依赖或组合关系时。
- 性能问题:如果策略类中有复杂的初始化或计算逻辑,频繁创建和切换策略对象可能会带来性能开销。
- 解决方案:
- 类结构优化:可以对策略类进行分类,通过包结构或抽象基类来组织相关策略类,便于管理和查找。例如,将所有与价格相关的折扣策略放在一个包下。
- 策略工厂和配置管理:使用策略工厂模式来创建策略对象,并结合配置文件或数据库来管理策略的选择逻辑。这样可以将策略选择的复杂逻辑集中管理,便于维护和修改。例如,根据用户类型、商品类别等条件从配置文件中读取应使用的策略类名,通过策略工厂创建相应的策略对象。
- 策略缓存:对于频繁使用且初始化开销大的策略对象,可以使用缓存机制,避免重复创建。例如,使用
HashMap
来缓存已经创建的策略对象,下次需要使用时先从缓存中查找。