前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >策略模式

策略模式

作者头像
胖虎
发布2019-06-26 15:47:50
4190
发布2019-06-26 15:47:50
举报
文章被收录于专栏:晏霖晏霖晏霖

前言

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

正文

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

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

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

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

参考文献:

  • https://blog.csdn.net/heroqiang/article/details/84843482
  • http://www.runoob.com/design-pattern/strategy-pattern.html

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

  • 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),注入接口,提供构造方法,定义调用接口的方法。

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));
    }
}

输出结果

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 晏霖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正文
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档