【设计模式-策略模式】
时间:2022-07-24
本文章向大家介绍【设计模式-策略模式】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
【导读】业务场景中,很多需要根据具体情况选择不同的处理方式,比如出行该选择何种交通方式,商场的活动的促销策略等。这就是策略模式。
一、定义
定义了算法家族,分别封装起来,让它们之间可以相互替换,算法的变化不会影响到使用算法的用户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
二、实例
就以商场促销策略为例,有满减策略、返现策略等。
策略:
//抽象的策略对象
public interface PromotionStrategy {
void doPromotion();
}
//具体的返现策略
public class FanXianPromotionStrategy implements PromotionStrategy {
@Override
public void doPromotion() {
System.out.println("返现促销");
}
}
//具体的满减策略
public class ManJianPromotionStrategy implements PromotionStrategy {
@Override
public void doPromotion() {
System.out.println("满减促销");
}
}
活动:
//促销活动
public class PromotionActivity {
//包含策略的引用
private PromotionStrategy promotionStrategy;
public PromotionActivity(PromotionStrategy promotionStrategy) {
this.promotionStrategy = promotionStrategy;
}
//执行策略的方法
public void executePromotionStrategy(){
promotionStrategy.doPromotion();
}
}
测试类:
public static void main(String[] args) {
//定义一个满减策略
PromotionActivity promotionActivity =
new PromotionActivity(new ManJianPromotionStrategy());
promotionActivity.executePromotionStrategy();
}
运行结果:
类图:
三、源码实例
(1)线程池创建的时候会有四种拒绝策略可以选择。
四种分别是:
AbortPolicy:直接抛异常策略
CallerRunsPolicy:调用者策略,将任务返回给调用者执行
DiscardOldestPolicy:直接丢弃等待时间最长的线程策略
DiscardPolicy:直接丢弃线程策略
- PHP经典面试题目汇总(上篇)
- 横向滑动的HorizontalListView滑动指定位置的解决方法
- 高可用架构-- MySQL主从复制的配置
- 零基础入门深度学习 | 第二章:线性单元和梯度下降
- 比特币价,黄金和无稽之谈 - 怎样不去给比特币估值
- 在PHP中,cookie和session的使用
- 剑指 offer代码解析——面试题29数组中出线次数超过一半的数字
- 剑指offer代码解析——面试题25二叉树中和为某一值的路径
- Spring MVC 4.2 CORS 跨域访问
- 剑指offer代码解析——面试题31连续子数组的最大和
- 在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解) 背景
- 剑指offer代码解析——面试题25二叉树中和为某一值的路径
- IntPtr 转 string
- 微信开发中网页授权access_token与基础支持的access_token异同
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 面试常考算法之区间问题
- 爬虫 | JS逆向某验滑动加密分析
- LeetCode | 28.实现strStr()
- Redis | Redis 哈希相关命令
- 如何访问SAP Spartacus里的config数据
- 工具系列 | HTTP API 身份验证和授权
- Providers in SAP Spartacus
- 详解ELF可执行文件格式:读取头部信息和程序表头
- 我用 Python 写了个基金涨跌通知助手
- 模仿腾讯新闻做了款新闻阅读小程序
- 使用关键点进行小目标检测
- 彻底搞懂 etcd 系列文章(八):etcd 事务 API
- 使用docker搭建一套开发环境全家桶
- TypeScript里的.d.ts语法
- 宋宝华:当Linux内核遭遇鲨鱼—kernelshark