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中,接口是一种抽象的数据类型,它定义了一组方法的签名,但没有提供方法的具体实现。接口可以被类实现,一个类可以实现一个或多个接口。

当你创建一个接口的对象时,你实际上是创建了一个指向具体实现类的引用。这意味着你可以使用接口类型的引用来调用实现类中定义的方法。