设计模式-策略模式

上文(设计模式-空对象模式):https://blog.csdn.net/qq_16498553/article/details/106821947


目录

上文(设计模式-空对象模式):https://blog.csdn.net/qq_16498553/article/details/106821947

背景

策略模式是什么?

角色:

策略模式可以干嘛?

优点:

缺点:

个人理解:

策略模式类图

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

实现代码

结果

(更多案例请下载源码,查看)

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

策略的一些开源码:

 最后


背景

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

策略模式是什么?

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

角色:

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

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

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

用户:具体请求的用户

策略模式可以干嘛?

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

优点:

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

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

缺点:

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

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

个人理解:

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

策略模式类图

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

实现代码

/**
 * @Auther: csh
 * @Date: 2020/6/17 15:22
 * @Description:抽象策略
 */
public interface Strategy {
    //打折接口
    Double doOperation(int price);
}
/**
 * @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);
    }
}
/**
 * @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;
    }
}

 

/**
 * @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;
    }
}

 

/**
 * @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);
    }


}

 

/**
 * @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));
    }
}

结果

普通会员价格:80.0
Vip会员价格:50.0
黄金会员价格:30.0

(更多案例请下载源码,查看)

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

策略的一些开源码:

jdk策略

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

抽象接口

 

 最后

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值