设计模式 | 策略模式
时间:2022-07-22
本文章向大家介绍设计模式 | 策略模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
说明
定义:将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,并让它们可以相互替换,这种模式就是策略模式。
简而言之就是多种条件对应多种操作, 对应条件使用对应操作类, 这些操作类叫做策略。那么有了这些策略, 我们还需要一个操作策略的, 不能光写if
条件实例化不同类啊, 那么这个时候需要一个Context
对象, 我们传递什么策略它来帮我们执行对应策略的方法, 策略方法也不是随便写的, 需要接口约束, 不然得乱套。
示例
<?php
/**
* Created by 憧憬.
*/
/**
* 用于支付
* Interface Pay
*/
interface Pay {
/**
* 生成支付参数
* @return mixed
* @author: 憧憬
*/
public function genPayParams();
/**
* 支付回调
* @return mixed
* @author: 憧憬
*/
public function callback();
}
class AliPay implements Pay {
public function genPayParams()
{
echo '生成支付宝支付参数';
}
public function callback()
{
echo '支付宝支付回调该做的事情';
}
}
class WxPay implements Pay {
public function genPayParams()
{
echo '生成微信支付参数';
}
public function callback()
{
echo '微信回调做事';
}
}
class Context {
private $straegy;
public function __construct(Pay $straegy)
{
$this->straegy = $straegy;
}
public function genPayParams()
{
$this->straegy->genPayParams();
}
public function callback()
{
$this->straegy->callback();
}
}
$aliStraegy = new Context(new AliPay());
// 有个用户使用支付宝支付了, 来处理一下
$aliStraegy->genPayParams(); // 生成支付宝支付参数
$aliStraegy->callback(); // 支付宝支付回调该做的事情
// 有个用户使用微信支付了, 来处理一下
$wxStraegy = new Context(new WxPay());
$wxStraegy->genPayParams(); // 生成微信支付参数
$wxStraegy->callback(); // 微信回调做事
结束语
策略模式可以很大程度上解决耦合,算法可以随便改动,并不会影响到使用者,缺点也不是很大问题,使用者必须知道所有策略并选择对应策略,策略类会逐步增多。
我们在开发中也应该注意
- 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起;
- 针对接口编程,不针对实现编程;
- 多用组合,少用继承。
本文为作者原创,手码不易,允许转载,转载后请以链接形式说明文章出处。
- python 日志模块 logging 详解
- 基于堆实现的优先级队列:PriorityQueue 解决 Top K 问题
- explain 深入剖析 MySQL 索引及其性能优化指南
- 图文并茂详解 SQL JOIN
- 自定义 hadoop MapReduce InputFormat 切分输入文件
- Hadoop MapReduce 二次排序原理及其应用
- MySQL Tips【Updating】
- Meltdown、Spectre攻击---CPU乱序执行和预测执行导致的安全问题
- WordPress 4.6远程代码执行漏洞(CVE-2016-10033)复现环境搭建指南
- 相似文档查找算法之 simHash 简介及其 java 实现
- Hadoop 中利用 mapreduce 读写 mysql 数据
- Android O中对TEE加解密算法的新要求
- storm 原理简介及单机版安装指南
- Python Tips, Tricks, and Hacks
- 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 数组属性和方法
- 字符串:听说你对KMP有这些疑问?
- C++ gflags库使用说明
- 字符串:KMP算法还能干这个!
- Day12 :数值的整数次方
- 字符串:前缀表不右移,难道就写不出KMP了?
- HTTP请求头referer
- 【干货】C++基础知识:继承与派生详解
- 文本相似度——编辑距离
- 文本相似度——汉明距离
- python函数——Bunch配置加载
- npm install、npm install --global、npm install --save、npm install --save-dev的区别
- 3种 Springboot 全局时间格式化方式,别再写重复代码了
- pip conda 安装速度慢解决方法
- Linux 中指定使用的GPU
- 未读消息(小红点),前端 与 RabbitMQ 实时消息推送实践,贼简单~