面试题答案
一键面试策略模式适用场景
- 多种算法的选择:系统中有多种算法,在不同的场景下需要动态选择不同的算法。例如,在一个支付系统中,有支付宝支付、微信支付、银联支付等多种支付方式,根据用户的选择动态切换支付算法。
- 行为的动态变化:一个类的行为或算法在运行时可以根据不同的条件进行改变。比如,游戏角色在不同的游戏场景下有不同的移动策略(飞行、行走、游泳等)。
- 避免使用大量的条件语句:当根据不同条件执行不同行为,使用大量
if - else
或switch - case
语句使代码冗长且难以维护时,策略模式可以将不同行为封装成独立的策略类,简化条件判断。
Java代码实现策略模式
- 定义策略接口:
这个接口定义了具体策略类需要实现的方法。所有的具体策略都要实现这个接口,以保证对外提供统一的行为定义。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"); } }
execute
方法,提供了具体的行为实现。 - 定义上下文类:
上下文类持有一个策略接口的引用,通过构造函数传入具体的策略对象。public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void executeStrategy() { strategy.execute(); } }
executeStrategy
方法调用策略对象的execute
方法,实现具体策略的执行。 - 使用策略模式:
在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
):定义了所有具体策略类需要实现的方法,它是具体策略类的抽象,为上下文类提供统一的调用接口。 - 具体策略类(如
ConcreteStrategyA
、ConcreteStrategyB
):实现策略接口,提供具体的算法或行为实现。 - 上下文类(
Context
):持有策略接口的引用,通过组合的方式与具体策略类关联,负责在运行时动态切换和调用具体策略的方法。
通过以上方式,在Java中实现了策略模式,使得代码具有更好的可维护性、可扩展性和灵活性。