MST
星途 面试题库

面试题:Java中策略模式的应用场景及实现要点

请阐述在Java中策略模式适用于哪些场景,并且详细说明如何在Java代码中实现策略模式,包括涉及到的类、接口及它们之间的关系。
19.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

策略模式适用场景

  1. 多种算法的选择:系统中有多种算法,在不同的场景下需要动态选择不同的算法。例如,在一个支付系统中,有支付宝支付、微信支付、银联支付等多种支付方式,根据用户的选择动态切换支付算法。
  2. 行为的动态变化:一个类的行为或算法在运行时可以根据不同的条件进行改变。比如,游戏角色在不同的游戏场景下有不同的移动策略(飞行、行走、游泳等)。
  3. 避免使用大量的条件语句:当根据不同条件执行不同行为,使用大量if - elseswitch - case语句使代码冗长且难以维护时,策略模式可以将不同行为封装成独立的策略类,简化条件判断。

Java代码实现策略模式

  1. 定义策略接口
    public interface Strategy {
        void execute();
    }
    
    这个接口定义了具体策略类需要实现的方法。所有的具体策略都要实现这个接口,以保证对外提供统一的行为定义。
  2. 实现具体策略类
    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");
        }
    }
    
    每个具体策略类实现了策略接口中的execute方法,提供了具体的行为实现。
  3. 定义上下文类
    public class Context {
        private Strategy strategy;
    
        public Context(Strategy strategy) {
            this.strategy = strategy;
        }
    
        public void executeStrategy() {
            strategy.execute();
        }
    }
    
    上下文类持有一个策略接口的引用,通过构造函数传入具体的策略对象。executeStrategy方法调用策略对象的execute方法,实现具体策略的执行。
  4. 使用策略模式
    public class Main {
        public static void main(String[] args) {
            Strategy strategyA = new ConcreteStrategyA();
            Context contextA = new Context(strategyA);
            contextA.executeStrategy();
    
            Strategy strategyB = new ConcreteStrategyB();
            Context contextB = new Context(strategyB);
            contextB.executeStrategy();
        }
    }
    
    main方法中,创建了不同的具体策略对象,并将其传递给上下文对象,通过上下文对象执行相应的策略。

类、接口关系

  • 策略接口(Strategy:定义了所有具体策略类需要实现的方法,它是具体策略类的抽象,为上下文类提供统一的调用接口。
  • 具体策略类(如ConcreteStrategyAConcreteStrategyB:实现策略接口,提供具体的算法或行为实现。
  • 上下文类(Context:持有策略接口的引用,通过组合的方式与具体策略类关联,负责在运行时动态切换和调用具体策略的方法。

通过以上方式,在Java中实现了策略模式,使得代码具有更好的可维护性、可扩展性和灵活性。