设计模式-策略模式

策略模式

定义

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

使用场景

策略模式主要解决程序中出现大量if else嵌套或case的情况,或未来有可能增加复杂场景的情况。

  1. 买物品支付的方式:现金、支付宝、微信、银行卡、信用卡等
  2. 系统生成唯一标识的算法选择:UUID、雪花算法、系统时间+随机码等方式
  3. 旅游的出行方式:公交、地铁、打车、步行等
  4. 用户登录的方式:验证码登录、支付宝授权登录、微信授权登录、账号密码登录等方式

类似使用这种设计模式的还有很多,需要依需求情况而定。

案例实现

案例

类图

策略模式的主要角色如下。

  1. 抽象策略(ComparatorPay)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
  2. 具体策略(ZhifubaoPayComparator、WinxinPayComparator)类:实现了抽象策略定义的接口,提供具体的算法实现。
  3. 环境(Context)类:持有一个策略类的引用,最终给客户端调用。

代码实现

  1. 支付接口类
/**
 * 支付选择器
 * @author Administrator
 */
public interface ComparatorPay<T> {

    /**
     * 支付的金额
     * @param money 金额
     */
    void pay(T money);
}
  • 定义了支付的接口,增加了泛型,用来满足不同参数类型。
  1. 支付接口实现类
/**
 * 微信支付
 * @author Administrator
 */
public class WinxinPayComparator implements ComparatorPay<Integer> {

    /**
     * 支付的金额
     *
     * @param money 金额
     */
    @Override
    public void pay(Integer money) {

        // 这里写正常的业务逻辑
        System.out.println("微信支付金额:"+money);
    }
}
/**
 * 支付宝支付
 * @author Administrator
 */
public class ZhifubaoPayComparator implements ComparatorPay<Integer> {

    /**
     * 支付的金额
     *
     * @param money 金额
     */
    @Override
    public void pay(Integer money) {

        // 这里写正常的业务逻辑
        System.out.println("支付宝支付金额:"+money);
    }
}
  • 上面是实现的支付宝和微信支付的策略方式,这里只写了简单的输出语句,业务上的逻辑需要自己补全。
  1. 策略控制类
/**
 * 策略控制类
 * @author Administrator
 */
public class Context {

    private ComparatorPay comparatorPay;

    public Context(ComparatorPay comparatorPay) {
        this.comparatorPay = comparatorPay;
    }

    public void pay(int money){
        comparatorPay.pay(money);
    }
}
  • 外部调用传递不同的策略实现,通过统一的支付方法进行支付。
  1. main方法验证
/**
 * 验证策略方式
 * @author jieya
 */
public class Test {

    public static void main(String[] args) {
        // 微信支付
        //Context context = new Context(new WinxinPayComparator());
        // 支付宝支付
        Context context = new Context(new ZhifubaoPayComparator());
        context.pay(500);
    }
}

总结

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

posted @ 2021-05-11 18:09  jieya  阅读(91)  评论(0编辑  收藏  举报