MST

星途 面试题库

面试题:Java多态下代码复用的设计模式应用

在Java多态的基础上,策略模式是如何进一步优化代码复用的?请详细阐述策略模式在Java多态代码复用场景中的结构、角色和具体实现方式,并对比不使用策略模式时代码复用的优缺点。
34.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

策略模式在Java多态基础上对代码复用的优化

在Java多态中,不同子类通过重写父类方法实现不同行为。策略模式在此基础上,将算法封装成独立的策略类,使算法的变化独立于使用它的客户端,进一步提高代码复用。通过将具体算法封装,避免在不同场景重复编写相似代码,当需要更换算法时,只需替换对应的策略类,而无需修改大量原有代码。

策略模式的结构与角色

  1. 抽象策略角色(Strategy):定义一个公共接口,所有具体策略类都实现这个接口。它声明了具体策略类要实现的方法。
  2. 具体策略角色(ConcreteStrategy):实现抽象策略角色定义的接口,封装具体的算法或行为。
  3. 环境角色(Context):持有一个抽象策略类的引用,通过构造函数或setter方法接收具体策略类实例。它提供一个方法,调用具体策略类实现的方法。

具体实现方式

  1. 定义抽象策略接口
public interface Strategy {
    void execute();
}
  1. 创建具体策略类
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的具体算法");
    }
}
  1. 定义环境类
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();
    }
}
  1. 使用策略模式
public class Main {
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStrategyA());
        context.executeStrategy();

        context.setStrategy(new ConcreteStrategyB());
        context.executeStrategy();
    }
}

对比不使用策略模式时代码复用的优缺点

  • 不使用策略模式的优点
    • 简单直接:对于简单的业务逻辑,代码量少,开发速度快。比如只有一种固定算法的场景,直接在相关类中编写代码,无需额外定义策略类等结构。
  • 不使用策略模式的缺点
    • 代码耦合度高:如果有多个不同算法,在一个类中通过大量条件语句判断选择算法,会使代码冗长且难以维护。当需要新增或修改算法时,需要在多处修改代码。
    • 复用性差:不同场景下若要使用不同算法,难以复用已有代码,需要重复编写相似的条件判断和算法实现。
    • 扩展性弱:新增算法时,需要修改原有类的代码结构,违反开闭原则,可能影响原有功能。