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

设计模式-策略模式

作者头像
逍遥壮士
发布2020-09-18 11:28:26
4230
发布2020-09-18 11:28:26
举报
文章被收录于专栏:技术趋势

背景

每当想起去书店买书,老是觉得老火,为啥同样一本书,卖我总是比别人贵呢?我买就只打8折为啥其他有7折的???人品问题???不是的,是因为会员制度,不同的会员等级享受不同的折扣,这个很类似我们的策略模式,不同的角色可以定义不同的算法。

策略模式是什么?

策略模式(Strategy Pattern),属于行为模式,定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

角色:

抽象策略角色(Stractegy):主要定义抽象接口

具体策略角色(ConcreteStrategy):负责具体策略实现

上下文:负责根据不同的用户信息调用不同策略

用户:具体请求的用户

策略模式可以干嘛?

策略模式主要解决一个问题,通过请求的对象,自身的信息进行决策匹配合适的算法进行业务逻辑的实现。

优点:

易扩展性:可以很方便添加策略,并且遵循开闭原则,对原来的策略不会造成任何影响;

策略类之间可以自由切换;

缺点:

上层模块必须知道所有的策略

过我的策略会导致类型非常庞大

个人理解:

策略模式好比你去超市买东西,同一样东西,不同的会员价格不一样的,有的打5折,有的打3折,有的打骨折。

策略模式类图

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

实现代码

代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/6/17 15:22
 * @Description:抽象策略
 */
public interface Strategy {
    //打折接口
    Double doOperation(int price);
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/6/17 15:25
 * @Description:普通会员(ConcreteStrategy)
 */
public class CommonMember implements Strategy {
    @Override
    public Double doOperation(int price) {
        return (price*0.8);
    }
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/6/17 15:52
 * @Description:VIP会员(ConcreteStrategy)
 */
public class VipMember implements Strategy {
    @Override
    public Double doOperation(int price) {
        return price*0.5;
    }
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/6/17 15:53
 * @Description:黄金会员(ConcreteStrategy)
 */
public class GoldMember implements Strategy {
    @Override
    public Double doOperation(int price) {
        return price*0.3;
    }
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/6/17 15:54
 * @Description:上下文
 */
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public Double executeStrategy(int price){
        return strategy.doOperation(price);
    }


}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/6/17 16:13
 * @Description:策略模式
 */
public class Client {
    public static void main(String[] args) {
        Context context = new Context(new CommonMember());
        System.out.println("普通会员价格:"+context.executeStrategy(100));
        context = new Context(new VipMember());
        System.out.println("Vip会员价格:"+context.executeStrategy(100));
        context = new Context(new GoldMember());
        System.out.println("黄金会员价格:"+context.executeStrategy(100));
    }
}

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

结果

代码语言:javascript
复制
普通会员价格:80.0
Vip会员价格:50.0
黄金会员价格:30.0

策略的一些开源码:

jdk策略

在spring中实现的策略模式实现:

抽象接口

实现

最后

策略模式在实现的研发过程中,真的很得非常普遍,比如订单价格计算,会员卡、活动等等无处不在的影子,而且实用性非常强,但是策略模式也有缺点就是一但策略类超过3个以上维护起来就不是很方便了,所以会加上其他模式组合使用比如策略+工厂。

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

本文分享自 技术趋势 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
  • 源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档