Java设计模式之策略模式

策略设计模式难易程度应该是仅次于单例模式的,无论是实现起来还是从结构上看,都非常简单,他跟简单工厂都一部分思想类似,大家可以结合一下简单工厂来看策略模式,大家千万不要记混了哦。

简述什么是策略模式:它定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户端应用而独立变化。

策略模式适用场景:策略模式适合解决当程序出现多个不同分支,而且每个分支的逻辑还比较复杂的场景。

举个例子:有一个业务要根据不同的类型选择不同的算法或者选择不同类型的支付方式,等等。

使用和阅读提示:并不是所有的策略模式都和本文案例一样,但不变的是思想,我们学设计模式学的就是思想。我们在网上找资料大家都知道写法千奇百怪,没有说谁都一定是对或错,就好比,同样是以支付为场景写的demo,下面这个写法就与为不同,他更偏向于实际业务需求,大家使用的时候各取所需就好了。

参考文献:

下面介绍策略模式都几个角色

Context(环境类):负责使用算法策略,其中维持了一个抽象策略类的引用实例。

Strategy(抽象策略类):所有策略类的父类,为所支持的策略算法声明了抽象方法。=› 既可以是抽象类也可以是接口

ConcreteStrategy(具体策略类):实现了在抽象策略类中声明的方法。

代码讲解

万物的开始皆源于一个接口——策略类

public interface PayStrategy {
    //支付的动作
    String doPay(String payer, int money);
}

具体策略类(ConcreteStrategy)。我定义了三个支付方式,分别实现了策略类。这一步和简单工厂很相像吧,都实现同一个接口。

public class AliPayStrategy implements PayStrategy{
   public String doPay(String payer, int money) {
       //调用阿里支付的三方操作……
       System.out.println("调用阿里支付成功,"+payer+"支付了" + money + "元");
       return "ok";
   }
}

public class ApplePayStrategy implements PayStrategy {
   public String doPay(String payer, int money) {
       //调用苹果支付的三方操作……
       System.out.println("调用苹果支付成,"+payer+"支付了" +  money + "元");
       return "ok";
   }
}

public class WeChatPayStrategy implements PayStrategy {
   public String doPay(String payer, int money) {
       //调用微信支付的三方操作……
       System.out.println("调用微信支付成功,"+payer+"支付了" + money + "元");
       return "ok";
   }
}

上下文环境(Context),注入接口,提供构造方法,定义调用接口的方法。

/*tianqiweiqi.com*/
public class Context {
   //策略模式核心类
   private PayStrategy payStrategy;

   public Context(PayStrategy payStrategy) {
       this.payStrategy = payStrategy;
   }

   //策略模式核心方法,用来调用支付动作的
   public String executeStrategy(String payer, int money) {
       return payStrategy.doPay(payer, money);
   }
}

让我们来测试一下

public class StrategyTest {
   public static void main(String[] args) {
       Context context = new Context(new AliPayStrategy());
       System.out.println(context.executeStrategy("胖虎", 5));
   }
}

输出结果

作者:

喜欢围棋和编程。

 
发布于 分类 编程标签

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注