设计模式-策略模式

用户云卷云舒  金牌会员 | 2024-9-12 05:43:51 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 674|帖子 674|积分 2022


目录
1.初步熟悉
2.脚色功能
3.代码实现 
4.优缺点
1.初步熟悉

   

  • 策略模式(Strategy Pattern):定义一系列的算法,把它们一个个封装起来,而且使它们可相互更换
  2.脚色功能

   

  • Context上下文:屏蔽高层模块对策略、算法的直接访问,封装大概存在的变革
  • Strategy策略脚色:抽象策略脚色,是对策略、算法家族的抽象,定义每个策略或算法必须具有的方法和属性
  • ConcreteStrategy详细策略脚色:用于实现抽象策略中的操纵,即实现详细的算法 
  3.代码实现 

实体类

  1. /**
  2. * 实体类
  3. */
  4. public class Order {
  5.     private double price;
  6.     private int userId;
  7.     private int productId;
  8.     public Order() {
  9.     }
  10.     public Order(double price, int userId, int productId) {
  11.         this.price = price;
  12.         this.userId = userId;
  13.         this.productId = productId;
  14.     }
  15.     public int getUserId() {
  16.         return userId;
  17.     }
  18.     public void setUserId(int userId) {
  19.         this.userId = userId;
  20.     }
  21.     public int getProductId() {
  22.         return productId;
  23.     }
  24.     public void setProductId(int productId) {
  25.         this.productId = productId;
  26.     }
  27.     public double getPrice() {
  28.         return price;
  29.     }
  30.     public void setPrice(double price) {
  31.         this.price = price;
  32.     }
  33. }
复制代码
抽象类

  1. /**
  2. * 抽象类
  3. */
  4. public abstract class Strategy {
  5.     //计算价格抽象方法,计算折扣价格
  6.     public abstract double computePrice(Order order);
  7. }
复制代码
上下文

  1. /**
  2. * @className: PromotionContext
  3. * @author: 会敲代码的小张
  4. * @date: 2024/9/10 11:55
  5. * @Version: 1.0
  6. * @description: 策略上下文
  7. */
  8. public class PromotionContext {
  9.     private Strategy strategy;
  10.     public PromotionContext(Strategy strategy) {
  11.         this.strategy = strategy;
  12.     }
  13.     /**
  14.      * 根据策略计算最终价格
  15.      * @param order
  16.      * @return
  17.      */
  18.     public double execute(Order order){
  19.         return strategy.computePrice(order);
  20.     }
  21. }
复制代码
详细的策略

  1. /**
  2. * @className: NormalActivity
  3. * @author: 会敲代码的小张
  4. * @date: 2024/9/10 11:57
  5. * @Version: 1.0
  6. * @description: 具体的策略-1-正常价格
  7. */
  8. public class NormalActivity extends Strategy{
  9.     @Override
  10.     public double computePrice(Order order) {
  11.         return order.getPrice();
  12.     }
  13. }
  14. /**
  15. * @className: DisCountActivity
  16. * @author: 会敲代码的小张
  17. * @date: 2024/9/10 11:58
  18. * @Version: 1.0
  19. * @description: 具体策略-2-打折价格
  20. */
  21. public class DisCountActivity extends Strategy {
  22.     //具体折扣
  23.     private double rate;
  24.     public DisCountActivity(double rate) {
  25.         this.rate = rate;
  26.     }
  27.     @Override
  28.     public double computePrice(Order order) {
  29.         return order.getPrice() * rate;
  30.     }
  31. }
复制代码
4.优缺点

   

  • 优点:

    • 满足开闭原则,当增加新的详细策略时,不需要修改上下文类的代码,上下文就可以引用新的详细策略的实例
    • 避免使用多重条件判定,如果不消策略模式大概会使用多重条件语句不利于维护,和工厂模式的搭配使用

  • 缺点:

    • 策略类数目会增多,每个策略都是一个类,复用的大概性很小
    • 对外暴露了类所有的行为和算法,行为过多导致策略类膨胀


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表