策略模式:设计模式中的一种

策略模式:设计模式中的一种

到目前为止,我们已经介绍了本系列中的三种设计模式。我们定义了四类不同的设计模式。在本文中,我将解释策略设计模式,它属于行为设计模式

你可能有一个问题:什么时候应该使用这种设计模式?我想说,当我们有多种方法(算法)来执行相同的操作,并且我们希望应用程序根据您拥有的参数选择特定的方法时。这种模式也称为策略模式

本文的一个非常简单的示例是排序功能。例如,我们有多种对数组进行排序的算法,但是根据数组元素的数量,我们应该选择使用哪种算法来获得最佳性能。

此模式也称为策略模式。

问题

我将举一个集成了多个支付网关的电子商务网站的例子。尽管该网站有多个支付网关,但根据要求,它们不会全部显示在前端。相反,需要根据购物车金额即时选择适当的支付网关。

举个简单的例子,如果购物车价值低于 500 美元,则应使用 PayPal 标准处理付款,但如果金额为 500 美元或以上,则应使用存储的信用卡详细信息进行处理(假设详细信息已存储)。

如果没有实施正确的策略,我们的代码将如下所示:

首先,我们将提供通过 Paypal 支付和通过信用卡支付的主要类,这些类将在下面添加。

// Class to pay using Credit Cardclass payByCC {    private $ccNum = '';private $ccType = '';private $cvvNum = '';private $ccExpMonth = '';private $ccExpYear = '';public function pay($amount = 0) {echo "Paying ". $amount. " using Credit Card";}}// Class to pay using PayPalclass payByPayPal {private $payPalEmail = '';public function pay($amount = 0) {echo "Paying ". $amount. " using PayPal";}}// This code needs to be repeated every place where ever needed.$amount  = 5000;if($amount >= 500) {$pay = new payByCC();$pay->pay($amount);} else {$pay = new payByPayPal();$pay->pay($amount);}

登录后复制

在这里,您可能会说我们需要放置条件语句才能使我们的代码正常工作。想象一下,当我们需要对该逻辑进行新的更改或者您发现该逻辑中的错误时,您需要进行多少更改。我们必须向所有使用该代码的地方添加补丁。

解决方案

我们将实现相同的要求,但使用策略模式,这使我们能够使我们的代码更加清晰、易于理解和可扩展。

界面

首先,我们将实现所有不同支付网关类将使用的接口。最终,这些是我们的策略。

interface payStrategy {    public function pay($amount);}class payByCC implements payStrategy {private $ccNum = '';private $ccType = '';private $cvvNum = '';private $ccExpMonth = '';private $ccExpYear = '';public function pay($amount = 0) {echo "Paying ". $amount. " using Credit Card";}}class payByPayPal implements payStrategy {private $payPalEmail = '';public function pay($amount = 0) {echo "Paying ". $amount. " using PayPal";}}

登录后复制

接下来我们将创建我们的主类,它可以使用与我们迄今为止实施的策略不同的策略。

class shoppingCart {    public $amount = 0;public function __construct($amount = 0) {$this->amount = $amount;}public function getAmount() {return $this->amount;}public function setAmount($amount = 0) {$this->amount = $amount;}public function payAmount() {if($this->amount >= 500) {$payment = new payByCC();} else {$payment = new payByPayPal();}$payment->pay($this->amount);}}

登录后复制

在这里我们可以看到我们的付款方式的条件加载是在 payAmount 方法中完成的。让我们将所有内容包装在一起,看看如何进一步使用它。

interface payStrategy {    public function pay($amount);}class payByCC implements payStrategy {private $ccNum = '';private $ccType = '';private $cvvNum = '';private $ccExpMonth = '';private $ccExpYear = '';public function pay($amount = 0) {echo "Paying ". $amount. " using Credit Card";}}class payByPayPal implements payStrategy {private $payPalEmail = '';public function pay($amount = 0) {echo "Paying ". $amount. " using PayPal";}}class shoppingCart {public $amount = 0;public function __construct($amount = 0) {$this->amount = $amount;}public function getAmount() {return $this->amount;}public function setAmount($amount = 0) {$this->amount = $amount;}public function payAmount() {if($this->amount >= 500) {$payment = new payByCC();} else {$payment = new payByPayPal();}$payment->pay($this->amount);}}$cart = new shoppingCart(499);$cart->payAmount();// OutputPaying 499 using PayPal$cart = new shoppingCart(501);$cart->payAmount();//Output Paying 501 using Credit Card

登录后复制

我们可以看到支付网关的翻转对于应用程序来说并不透明。根据参数,它有适当的支付网关可用于处理交易。

添加新策略

如果在后期用户需要添加具有不同逻辑的新策略(此处为新支付网关),在这种情况下会非常简单。假设我们要添加一个新的支付网关 Moneybooker,并希望在购物车金额超过 500 美元但低于 1,000 美元时处理资金。

我们需要做的就是创建一个新的策略类来实现我们的接口,我们就可以开始了。

class payByMB implements payStrategy {    private $mbEmail = '';public function pay($amount = 0) {echo "Paying ". $amount. " using Money Booker";}}

登录后复制

我们现在已经准备好了新的策略类,我们需要更改的是主要的 payAmount 方法。需要修改如下:

public function payAmount() {    if($this->amount > 500 && $this->amount amount >= 500) {$payment = new payByCC();} else {$payment = new payByPayPal();}$payment->pay($this->amount);}

登录后复制

在这里您可以看到我们仅在 payAmount 方法中进行了更改,而不是在调用该方法的客户端代码中进行了更改。

结论

因此得出结论,当我们有多种方法来执行同一任务时(在软件语言中,当我们有多种算法来执行同一操作时),我们应该考虑实现策略模式。

通过使用这种模式,我们可以自由地添加/删除算法,因为这些算法的切换对于应用程序来说并不透明。

我已尽力提供一个基本但有用的示例来演示策略设计模式,但如果您有其他意见或问题,请随时将它们添加到下面的提要中。

以上就是策略模式:设计模式中的一种的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1703131.html

(0)
上一篇 2025年2月19日 15:02:54
下一篇 2025年2月19日 15:03:10

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • PHP高阶开发:了解常用设计模式

    在php高阶开发中,一个关键的技能是了解常用的设计模式。设计模式是解决特定问题的经过验证的解决方案,可以帮助我们编写更容易维护、可扩展和灵活的代码。在这篇文章中,我们将了解一些常用的设计模式,并介绍它们在php中的应用。 单例模式 单例模式…

    编程技术 2025年3月30日
    100
  • 分享 word下标的相关知识

    php小编苹果带来分享word下标的相关知识。在word文档中,下标是一种特殊的文本格式,通常用于显示化学式中的化学元素、数学公式中的下标数字等。掌握如何在word中添加和编辑下标,可以让文档更具专业性和准确性。本文将介绍如何在word文档…

    2025年3月29日 互联网
    100
  • 高德地图根据关键词坐标拾取小工具_html/css_WEB-ITnose

    今天早上在写代码的时候,需要用到地图坐标拾取工具,我们用的是搞的地图,在高德地图api官方网站中没有找到相关的坐标拾取工具。在网上找到这么个小工具,与大家分享下! CSS 1 html { background-color: #fff; }…

    编程技术 2025年3月28日
    100
  • 如何利用Vue和Excel快速生成交互式数据报告

    如何利用vue和excel快速生成交互式数据报告 引言:在现代商业和数据分析领域,数据报告是一种非常重要的工具。它们可以帮助我们更好地理解和分析数据,发现数据中的趋势和模式,并支持业务决策。而借助于Vue和Excel这两个强大的工具,我们可…

    编程技术 2025年3月13日
    200
  • 学习Vue 3中的组合式API,更好地组织和管理组件代码

    学习Vue 3中的组合式API,更好地组织和管理组件代码 Vue 3是当前最新版本的Vue框架,它引入了许多令人兴奋的新特性和改进,其中最引人注目的是组合式API。组合式API使我们能够更好地组织和管理组件代码,更好地重用和共享逻辑。 在V…

    2025年3月13日
    200
  • 了解Vue 3中的Fragments特性,优化DOM结构

    随着前端技术的不断发展,Vue框架也在不断更新迭代。其中,Vue 3作为Vue框架的最新版本,引入了许多新的特性和优化。其中一个值得关注的特性就是Fragments(碎片)。本文将介绍Vue 3中的Fragments特性,并探讨如何利用它来…

    2025年3月13日
    200
  • javascript中什么是设计模式

    在javascript中,设计模式 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、 可维护性、灵活性好。 本教程操作环境:windows7系统、javas…

    2025年3月11日
    200
  • vue运用了哪些模式

    vue运用的设计模式:1、单例模式,确保一个类只有一个实例对象,并提供一个全局访问点供其访问。2、工厂模式,是用来创建对象的一种模式,不必暴露构造函数的具体逻辑,而是将逻辑封装在一个个函数之中。3、装饰器模式,允许向现有的函数添加新的功能,…

    2025年3月11日
    200
  • 浅析CSS中的5种设计模式,聊聊vue项目中CSS目录代码的作用

    本篇文章带大家聊聊css中的5种设计模式,并介绍一下vue3项目中个css style目录中的代码作用,希望对大家有所帮助! 工作了几年,发现在项目中经常存在如下问题: 1.模块拆分不合理2.变量和函数命名不知所云3.缺少注释或者是写了一堆…

    2025年3月10日
    200
  • 哪些免费的dll修复工具可以使用?

    免费的dll修复工具有哪些 导语:随着电脑使用的频繁,有时我们可能会遇到一些dll文件损坏或丢失的问题,这会导致某些软件无法正常运行,给用户带来了很大的困扰。幸运的是,市面上有一些免费的dll修复工具可以帮助我们解决这个问题。本文将介绍几款…

    互联网 2025年3月9日
    200

发表回复

登录后才能评论