面试题答案
一键面试策略模式在Java多态基础上对代码复用的优化
在Java多态中,不同子类通过重写父类方法实现不同行为。策略模式在此基础上,将算法封装成独立的策略类,使算法的变化独立于使用它的客户端,进一步提高代码复用。通过将具体算法封装,避免在不同场景重复编写相似代码,当需要更换算法时,只需替换对应的策略类,而无需修改大量原有代码。
策略模式的结构与角色
- 抽象策略角色(Strategy):定义一个公共接口,所有具体策略类都实现这个接口。它声明了具体策略类要实现的方法。
- 具体策略角色(ConcreteStrategy):实现抽象策略角色定义的接口,封装具体的算法或行为。
- 环境角色(Context):持有一个抽象策略类的引用,通过构造函数或setter方法接收具体策略类实例。它提供一个方法,调用具体策略类实现的方法。
具体实现方式
- 定义抽象策略接口:
public interface Strategy {
void execute();
}
- 创建具体策略类:
public class ConcreteStrategyA implements Strategy {
@Override
public void execute() {
System.out.println("执行策略A的具体算法");
}
}
public class ConcreteStrategyB implements Strategy {
@Override
public void execute() {
System.out.println("执行策略B的具体算法");
}
}
- 定义环境类:
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void executeStrategy() {
strategy.execute();
}
}
- 使用策略模式:
public class Main {
public static void main(String[] args) {
Context context = new Context(new ConcreteStrategyA());
context.executeStrategy();
context.setStrategy(new ConcreteStrategyB());
context.executeStrategy();
}
}
对比不使用策略模式时代码复用的优缺点
- 不使用策略模式的优点:
- 简单直接:对于简单的业务逻辑,代码量少,开发速度快。比如只有一种固定算法的场景,直接在相关类中编写代码,无需额外定义策略类等结构。
- 不使用策略模式的缺点:
- 代码耦合度高:如果有多个不同算法,在一个类中通过大量条件语句判断选择算法,会使代码冗长且难以维护。当需要新增或修改算法时,需要在多处修改代码。
- 复用性差:不同场景下若要使用不同算法,难以复用已有代码,需要重复编写相似的条件判断和算法实现。
- 扩展性弱:新增算法时,需要修改原有类的代码结构,违反开闭原则,可能影响原有功能。