当前位置: 首页 > news >正文

设计模式(19):策略模式

策略模式

  • 策略模式对应与解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用哪个算法。

本质

  • 分离算法,选择实现;

策略模式角色

  • 上下文类(Context): 维护了一个策略类的引用,并将客户端的请求委托给具体策略类处理;
  • 抽象策略类(Strategy): 定义了具体的算法方法;
  • 具体策略类(ConcreteStrategy): 对抽象策略类的算法具体实现;

开发中常见的场景

  • spring框架中,Resource接口,资源访问策略;
  • springmvc框架中,controller方法入参解析
  • shiro框架中,权限的认证策略;

场景

  • 某个市场人员接到单后的报价策略(CRM系统中常见问题)。报价策略很复杂,可以简单作如下分类:
    • 普通客户小批量报价
    • 普通客户大批量报价
    • 老客户小排量报价
    • 老客户大批量报价
  • 具体选用哪个报价策略,这需要根据实际情况来确定。这时候,我们采用策略模式即可。

代码实现

  • 抽象策略类(Strategy)
/*** 抽象算法 接口*/
public interface  Strategy {double getPrice(double standardPrice);
}
  • 具体策略类(ConcreteStrategy)
/*** 新客户小批量*/
public class NewCustomerFewStrategy implements Strategy{@Overridepublic double getPrice(double standardPrice) {System.out.println("不好意思,不打折,原件");return standardPrice;}	
}
/*** 新客户大批量*/
public class newCustomermanyStrategy implements Strategy{@Overridepublic double getPrice(double standardPrice) {System.out.println("九折");return standardPrice*0.9;}	
}
/*** 老客户小批量*/
public class OldCustomerFewStrategy implements Strategy{@Overridepublic double getPrice(double standardPrice) {System.out.println("八五折");return standardPrice*0.85;}	
}
/*** 老客户大批量*/
public class OldCustomermanyStrategy implements Strategy{@Overridepublic double getPrice(double standardPrice) {System.out.println("七折");		return standardPrice*0.7;	}	
}
  • 上下文类(Context)
/*** 负责和具体的策略类交互* 这样的话,具体的算法和直接的客户端调用分离了,使得算法可以独立于客户端独立的变化*/
public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void setStrategy(Strategy strategy) {this.strategy = strategy;}public void PrintPrice(double s){System.out.println("你该报价:"+strategy.getPrice(s));}	
}
  • 客户端调用
public static void main(String[] args) {Strategy st=new OldCustomermanyStrategy();Context ct=new Context(st);ct.PrintPrice(999);
}



更多设计模式学习:

          设计模式(1):介绍
          设计模式(2):单例模式
          设计模式(3):工厂模式
          设计模式(4):建造者模式
          设计模式(5):原型模式
          设计模式(6):桥接模式
          设计模式(7):装饰器模式
          设计模式(8):组合模式
          设计模式(9):外观模式
          设计模式(10):享元模式
          设计模式(11):适配器模式
          设计模式(12):代理模式
          设计模式(13):模板方法模式
          设计模式(14):命令模式
          设计模式(15):迭代器模式
          设计模式(16):观察者模式
          设计模式(17):中介者模式
          设计模式(18):状态模式
          设计模式持续更新中…

http://www.lryc.cn/news/331821.html

相关文章:

  • Linux 命令 top 详解
  • Android安卓开发 - 简单介绍(一)
  • AJAX —— 学习(二)
  • CSC博士联培申请时间线
  • 大数据实验三-HBase编程实践
  • 【Python】Pillow支持的图像文件格式
  • 算法——最小生成树
  • OpenHarmony相机和媒体库-如何在ArkTS中调用相机拍照和录像。
  • 【EasyExcel】多sheet、追加列
  • 韩顺平 | 零基础快速学Python
  • docker部署DOS游戏
  • 基于单片机的无线红外报警系统
  • 【JAVAEE学习】探究Java中多线程的使用和重点及考点
  • Day81:服务攻防-开发框架安全SpringBootStruts2LaravelThinkPHPCVE复现
  • .kat6.l6st6r勒索病毒肆虐,这些应对策略或许能帮到你
  • maya移除节点 修改节点
  • 嵌入式算法开发系列之卡尔曼滤波算法
  • 简述对css工程化的理解
  • .NET 5种线程安全集合
  • 计算机信息自查
  • 配置vite配置文件更改项目端口、使用@别名
  • 【LeetCode热题100】【链表】环形链表
  • SpringBoot整合ELK8.1.x实现日志中心教程
  • 计算机网络:数据链路层 - 封装成帧 透明传输 差错检测
  • Open3D (C++) 计算点云的特征值特征向量
  • Java | Leetcode Java题解之第8题字符串转换整数atoi
  • BL200耦合器数据采集模块
  • 基于Uni-app的体育场馆预约系统的设计与实现
  • 1.Spring Boot框架整合
  • 如何在 Debian VPS 上添加、删除和授予用户 sudo 权限