java设计模式之策略模式

一 、什么是策略模式?

策略模式指的是可以实现目标的方案集合,在某些特定情况下,策略之间是可以相互替换的。
如满减活动中,可以有满30减5元、满50减10元等,
如购物系统中针对不通过用户等级进行不同的折扣,原价(普通顾客),九折(会员),八折(超级会员)和七折(金牌会员)等,这些策略相互排斥、可替换。
一种行为型模式,指的是定义一系列算法,将每一个算法封装起来,并让他们可以相互替换。
策略模式只适用管理一组同类型的算法,并且这些算法是完成互斥的。

二、策略模式角色组成

  • 封装角色:上层访问策略的入口,它持有抽象策略角色的引用
  • 抽象策略角色:提供接口或者抽象类,定义策略组必须拥有的方法和属性
  • 抽象策略角色:提供接口或者抽象类,定义策略组必须拥有的方法和属性
  • 客户端:策略调用方

三、关系图在这里插入图片描述

四、策略模式的优点?

  • 最小范围修改。
  • 避免代码重复。
  • 减少if-else, 避免多重if-else判断。
  • 降低维护成本。
  • 提示可扩展性。

五、策略模式的缺点?

  • 策略类会增多。
  • 所有策略类都需要对外暴露。

六、实现

我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。
StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。

步骤 1
创建一个接口。

Strategy.java

public interface Strategy {
   public int doOperation(int num1, int num2);
}`

步骤 2
创建实现接口的实体类。

OperationAdd.java

public class OperationAdd implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 + num2;
   }
}

OperationSubtract.java

public class OperationSubtract implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 - num2;
   }
}

OperationMultiply.java

public class OperationMultiply implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 * num2;
   }
}

步骤 3
创建 Context 类。

Context.java

public class Context {
   private Strategy strategy;
  
   public Context(Strategy strategy){
      this.strategy = strategy;
   }
  
   public int executeStrategy(int num1, int num2){
      return strategy.doOperation(num1, num2);
   }
}

步骤 4
使用 Context 来查看当它改变策略 Strategy 时的行为变化。

StrategyPatternDemo.java

public class StrategyPatternDemo {
   public static void main(String[] args) {
      Context context = new Context(new OperationAdd());   
      System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
  
      context = new Context(new OperationSubtract());     
      System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
  
      context = new Context(new OperationMultiply());   
      System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
   }
}

步骤 5
执行程序,输出结果:

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

参考文档:https://www.cnblogs.com/mr-wuxiansheng/p/14459457.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值