【大话设计模式】-- 策略者模式(Strategy):它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变法,不会影响到使用算法的客户。

策略模式的核心就是屏蔽内部策略算法,内部的算法是可以随时替换,对外部是没有感知的。若新增或修改内部的算法,只需要修改或者扩展相应的策略类,客户端的代码无需改动,符合设计模式中一个重要的原则:开闭原则。

一. 业务需求背景

1.需求目的:

用户可以进行对某种配置进行预约,到达配置的预约时间点,根据Redis队列的预约号执行预约,不同类型的配置预约操作逻辑完全不同。

2.流程图:

二. 使用策略模式的缘由

此业务由于是要支持不同配置的预约,以及后期可能会有很多种类型的配置,而且不同类型的配置又完成不同,如果直接编码,后期的扩展性以及维护性会比较麻烦。

1.正常代码实现:

<?php
public function makeReservation($mainkey){
$type = getReservationTypeByMainkey($mainkey);
switch($type):{
case 'A':
$this->reservationAConfig($mainkey);
break;
case 'B':
$this->reservationBConfig($mainkey);
break;
.....
}
} private function reservationAConfig($mainkey){
//这里进行A配置的预约逻辑操作
} private function reservationBConfig($mainkey){
//这里进行B配置的预约逻辑操作
} private function getReservationTypeByMainkey($mainkey){
//根据预约号获取预约配置的类型
}

这样子的实现也是可以满足业务需求,代码的可读性也还好。但是会有一个问题,这种预约的配置种类会很多,会导致switch的语句会越来越多,也可能会修改一些预约配置逻辑。这样子的话就需要修改原来的代码,对于代码质量来说,这并不是一种好的现象。

2.策略模式实现

<?php

interface ReservationStrategy
{
//执行预约配置逻辑操作
public function makeReservation();
} //策略处理类
class ReservationHandler
{
private $strategy = null;
public function __construct(ReservationStrategy $strategy){
$this->$strategy = $strategy;
} //封装了策略执行的逻辑,所有执行的预约配置统一调用这个方法
public function makeReservation(){
$this->$strategy->makeReservation();
} } //A配置的具体策略类
class AReservationStrategy implements ReservationStrategy
{
public function makeReservation(){
//这里执行A配置的逻辑操作
;
} class ReservationFacaory
{
public static function getReservationInstance($mainkey){
//这里可以根据预约号做具体逻辑生成策略对象
}
}
//预约控制器代码
class ReservationController
{
public function makeReservation($mainkey){
//根据工厂对象创建预约策略实例
$reservation = ReservationFacaory::getReservationInstance($mainkey);
//传入实例给策略处理类
$handler = new ReservationHandler($reservation);
//执行预约策略
$handler->makeReservation();
} }

以上代码使用了工厂模式以及策略模式的结合,其中ReservationHandler类作为处理上下文的类,通过依赖注入相应的策略类,直接调用makeReservation方法。在客户端代码只需要调用此方法即可,即使后期预约逻辑也无需改动客户端的代码。在此业务需求,因为需求并不是很大,所以工厂类只是简单实现。如果想要更完善,工厂类根据反射机制以及约定好的类名动态生成实例,这样后期如果扩展类型,只需要实现相应的接口即可,无需改动其他代码,很方便扩展。

总结

实践才能出真知。以前看大话设计模式这本书,总觉得自己看了好多遍但是还是云里雾里的,不知道为什么需要这种代码结构。但是通过一个小需求设计这么一个结构,我很快就能get到这种结构带来的好处。虽然在这个业务上,这种结构的优势并没有特别的明显,甚至可能有点增加代码量,但是我相信在后期扩展以及维护方便是有很大的好处的。记录这篇文章,主要是想要记录自己的思考方式以及学习体会,如果有一些不太对的地方欢迎大家指正,一起进步!!

策略模式在PHP业务代码的实践的更多相关文章

  1. 策略模式+注解 干掉业务代码中冗余的if else...

    前言: 之前写过一个工作中常见升级模式-策略模式 的文章,里面讲了具体是怎样使用策略模式去抽象现实中的业务代码,今天来拿出实际代码来写个demo,这里做个整理来加深自己对策略模式的理解.   一.业务 ...

  2. 使用策略模式重构switch case 代码

    目录 1.背景 2.案例 3.switch…case…方式实现 4.switch…case…带来的问题 5.使用策略模式重构switch…case…代码 6.总结 1.背景 之前在看<重构    ...

  3. 策略模式原理及Java代码实例

    一.策略模式的定义 —— 定义了一组算法,将每个算法包装起来,并且使它们之间可以互换 —— 策略模式使这些算法在客户端调用它们的时候能够相互不影响的变化,改变不同算法的实现方式不影响客户端的使用,即策 ...

  4. 策略模式 - OK

    策略模式(Strategy):它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户. 策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的 ...

  5. 再起航,我的学习笔记之JavaScript设计模式20(策略模式)

    策略模式 策略模式(Strategy):将定义的一组算法封装起来,使其相互之间可以替换.封装的算法具有一定的独立性,不会随客户端变化而变化. 其实策略模式在我们生活中可应用的地方还是比较多的,比如在商 ...

  6. JavaScript设计模式 Item 7 --策略模式Strategy

    1.策略模式的定义 何为策略?比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但是不在乎钱,可以选择坐飞机. 如果没有钱,可以选择坐大巴或者火车. 如果再穷一点,可以选 ...

  7. JDK设计模式之——策略模式(Comparable和Comparator接口)

    策略模式:其实就是java的多态...父类引用指向子类对象. 使用策略模式,改善排序算法上文中需要排序的是一个数组 让他可以对任何类型的数组进行排序 1.利用 接口 Comparable<T&g ...

  8. JavaScript形而上的策略模式

    什么是策略模式? 先看代码片段1. // 代码片段1 var bonus = new Bonus(); bonus.setSalary(10000); bonus.setStrategy(new pe ...

  9. 策略模式与SPI机制,到底有什么不同?

    这里说的策略模式是一种设计模式,经常用于有多种分支情况的程序设计中.例如我们去掉水果皮,一般来说对于不同的水果,会有不同的拨皮方式.此时用程序语言来表示是这样的: if(type == apple){ ...

随机推荐

  1. leetcode8 字符串转换整数

    <cctype> isdigit(char) 问题:在做乘法,加法前,先判断是否溢出 &&优先级大于== 然后教训: 考虑情况不周.比如3.14这样 然后解决办法 多自己搞 ...

  2. codeforces 9D(非原创)

    D. How many trees? time limit per test 1 second memory limit per test 64 megabytes input standard in ...

  3. 2017.8.11 think list

    递推式与模数不互质,如何利用中国剩余定理综合答案

  4. 大数据开发-linux后台运行,关闭,查看后台任务

    在日常开发过程中,除了例行调度的任务和直接在开发环境下比如Scripts,开发,很多情况下是shell下直接搞起(小公司一般是这样),看一下常见的linux后台运行和关闭的命令,这里做一个总结,主要包 ...

  5. USB2.0协议学习笔记---USB工作过程(类的方法)

    前面学习了那么多的概念,这里需要记住一点分层概念即设备 ---> 配置 ---> 接口 ---> 端点,这种分层的概念结构 . 也可以理解为端点构成接口,接口组成配置,配置组成设备. ...

  6. Emoji of github & twitter

    Emoji cheat sheet http://www.emoji-cheat-sheet.com/ https://github.com/xgqfrms/emoji-cheat-sheet.com ...

  7. npm ci All In One

    npm ci All In One npm 性能优化 npm ci 使用干净的面板安装项目 https://docs.npmjs.com/cli/v6/commands/npm-ci # npm cl ...

  8. git config [section] solutions

    git config [section] solutions fix git [section] warnings global config $ vim ~/.gitconfig [user] em ...

  9. OAuth 2.0 All In One

    OAuth 2.0 All In One 授权类型 授权代码 隐式 密码凭证 客户端凭证 授权码 授权码授予类型要求用户向提供者进行身份验证-然后将授权码发送回客户端应用程序,提取并与提供者交换以获取 ...

  10. React 权限管理

    React 权限管理 react in depth JWT token access_token & refresh_token access token & refresh toke ...