Java设计模式-策略模式详解
1.策略模式基本了解
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一组可以相互替换的算法,使得客户端可以根据不同的需求选择不同的算法,将对象和行为分开。
在策略模式中,我们创建了一个策略接口,该接口定义了所有必需的方法。然后,我们创建了实现了该策略接口的具体策略类。最后,客户端代码在运行时根据需求选择不同的策略。
策略模式的主要优点是它使得算法可以*切换,避免了使用多重条件语句判断,提高了代码的可维护性和扩展性。缺点是随着策略的增多,所有策略类都需要对外暴露,这可能导致客户端代码过于复杂。
if-else也可以实现,但是我们最终的目的不就是为了可维护性高,以及装逼嘛(开个玩笑),毕竟很多Java的框架源代码都用到了这种模式,了解之后有助于学习这些框架。
2.三要素
- 策略接口:策略接口定义了所有具体策略类必须实现的方法
- 具体策略类:具体策略类实现了策略接口,并提供了具体的算法实现
- 上下文类:上下文类持有一个策略接口的引用,并在运行时根据需要调用具体策略类的方法
3.使用场景:
即不同的对象对于同一动作有不同的行为的时候。
比如同样都是支付行为,微信支付没有优惠,支付宝支付有优惠。支付动作可以定义在策略接口,微信支付和支付宝支付分别实现这个接口,然后支付者作为使用者有一个统一的支付方法,参数就是支付策略接口,那么选择支付宝支付,就是策略接口指向支付宝支付实现类,然后调用支付方法。
// 策略接口
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();
}
}
// 使用策略模式
public class Main {
public static void main(String[] args) {
Strategy strategy1 = new ConcreteStrategy1();
Strategy strategy2 = new ConcreteStrategy2();
Context context = new Context(strategy1);
context.executeStrategy();
context.setStrategy(strategy2);
context.executeStrategy();
}
}
知识点补充:
在Java中,接口是一种抽象的数据类型,它定义了一组方法的签名,但没有提供方法的具体实现。接口可以被类实现,一个类可以实现一个或多个接口。
当你创建一个接口的对象时,你实际上是创建了一个指向具体实现类的引用。这意味着你可以使用接口类型的引用来调用实现类中定义的方法。