面试题答案
一键面试策略模式结构
- 抽象策略(Strategy):定义一个公共接口,所有具体策略类都要实现这个接口。这是策略的抽象,为具体策略类提供统一的方法定义。
- 具体策略(ConcreteStrategy):实现抽象策略定义的接口,提供具体的算法或行为实现。不同的具体策略类实现不同的业务逻辑。
- 环境(Context):持有一个抽象策略类型的引用,通过构造函数或setter方法传入具体策略对象。它提供一个方法,内部调用具体策略对象的方法,执行相应的策略。
多态在策略模式中的作用及优化代码方式
- 替代条件判断语句:在没有策略模式和多态时,如果系统中有多种不同的算法或行为,可能会使用大量的条件判断语句(如if - else或switch - case)来根据不同的条件选择不同的算法。例如:
if (type == 1) {
// 执行算法1
} else if (type == 2) {
// 执行算法2
} else {
// 执行默认算法
}
这种方式代码冗长且不易维护,当新增一种算法时,需要修改多处条件判断代码。
- 策略模式结合多态优化:在策略模式中,利用多态特性,环境类(Context)只依赖抽象策略接口。通过将具体策略类实例化并传递给环境类,在运行时根据具体传入的策略对象决定执行哪种算法。例如:
// 抽象策略接口
interface Strategy {
void execute();
}
// 具体策略类1
class ConcreteStrategy1 implements Strategy {
@Override
public void execute() {
System.out.println("执行策略1");
}
}
// 具体策略类2
class ConcreteStrategy2 implements Strategy {
@Override
public void execute() {
System.out.println("执行策略2");
}
}
// 环境类
class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void executeStrategy() {
strategy.execute();
}
}
在使用时:
// 使用具体策略1
Context context1 = new Context(new ConcreteStrategy1());
context1.executeStrategy();
// 使用具体策略2
Context context2 = new Context(new ConcreteStrategy2());
context2.executeStrategy();
通过这种方式,新增策略时只需创建新的具体策略类实现抽象策略接口,而不需要修改环境类的代码,大大简化了复杂系统的代码结构,提高了代码的可维护性和可扩展性。