策略模式简介

策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现。策略模
式最大的特点是行为的变化,行为之间可以相互替换。

模式结构

策略模式包含如下角色:

Strategy: 抽象策略类:策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法

Context: 环境类 /上下文类:

上下文是依赖于接口的类,即上下文包含用策略(接口)声明的变量。
上下文提供一个方法,该方法委托策略变量调用具体策略所实现的策略接口中的方法(实现接口的类重写策略(接口)中的方法,来完成具体功能)

ConcreteStrategy: 具体策略类:具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体方法。(说白了就是重写策略类的方法!)

抽象类策略

  1. //抽象策略类
  2. public interface MemberStrategy {
  3. // 一个计算价格的抽象方法
  4. //price商品的价格 n商品的个数
  5. public double calcPrice(double price, int n);
  6. }

具体实现类

  1. public class V1Member implements MemberStrategy{
  2. //V1 会员不打折
  3. @Override
  4. public double calcPrice(double price, int n) {
  5. return price * n;
  6. }
  7. }
  1. public class V2Member implements MemberStrategy{
  2. //V2 会员打九折
  3. @Override
  4. public double calcPrice(double price, int n) {
  5. return price * n * 0.9;
  6. }
  7. }
  1. public class V3Member implements MemberStrategy{
  2. //V3 会员打八折
  3. @Override
  4. public double calcPrice(double price, int n) {
  5. return price * n * 0.8;
  6. }
  7. }

上下文类

  1. //上下文类
  2. public class MemberContext {
  3. //策略接口
  4. private MemberStrategy memberStrategy;
  5. //调用构造方法
  6. public MemberContext(MemberStrategy memberStrategy){
  7. this.memberStrategy = memberStrategy;
  8. }
  9. // 计算价格
  10. public double Price(double price, int n){
  11. return memberStrategy.calcPrice(price, n);
  12. }
  13. }

测试类

  1. //测试类
  2. public class TestStrategy {
  3. public static void main(String[] args) {
  4. // 创建会员的实例 具体行为策略
  5. MemberStrategy v1 = new V1Member(); //向上转型 面向接口编程
  6. MemberStrategy v2 = new V2Member();
  7. MemberStrategy v3 = new V3Member();
  8. // 用户选择不同策略
  9. MemberContext v1c = new MemberContext(v1);
  10. MemberContext v2c = new MemberContext(v2);
  11. MemberContext v3c = new MemberContext(v3);
  12. //计算一本300块钱的书
  13. System.out.println("初级会员的价格: "+v1c.Price(300, 1));
  14. System.out.println("中级会员的价格: "+v2c.Price(300, 1));
  15. System.out.println("高级会员的价格: "+v3c.Price(300, 1));
  16. }
  17. }
  18. 输出:
  19. 初级会员的价格: 300.0
  20. 中级会员的价格: 270.0
  21. 高级会员的价格: 240.0

策略模式优缺点

优点

策略模式提供了对 开闭原则 的完美实现 ,用户可以在不修改原有系统的基础上选择算法或者行为,也可以灵活的增加 新的算法或行为

缺点

客户端必须知道所有的策略类,并自行决定使用哪一个类

策略模式产生很多策略类,可以通过使用享元模式 在一定程度上减少对象的数量

策略模式适用的场景

1、电商网站支付方式,一般分为银联、微信、支付宝,可以采用策略模式
2、电商网站活动方式,一般分为满减送、限时折扣、包邮活动,拼团等可以采用策略模式