经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
策略模式(Strategy)
来源:cnblogs  作者:echoou  时间:2021/1/18 16:28:09  对本文有异议

策略模式(Strategy)

策略模式定义

策略模式是把算法,封装起来。使得使用算法和使用算法环境分离开来,当算法发生改变时,我们之需要修改客户端调用算法,和增加一个新的算法封装类。比如超市收银,收营员判断顾客是否是会员,当顾客不是会员时候,按照原价收取顾客购买商品费用,当顾客是会员的时候,满100减5元。

策略模式的优点

  • 降低代码耦合度,
  • 增加代码重用性,当需要实现新的算法时候,只需要修改算法部分,而不需要对上下文环境做任何改动;
  • 增加代码可阅读性,避免使用if....else嵌套,造成难以理解的逻辑;

策略模式的缺点

  • 当策略过多的时候,会增加很多类文件;

代码实现

Cashier.php

  1. <?php
  2. namespace App\Creational\Strategy;
  3. class Cashier
  4. {
  5. private $cutomer;
  6. public function setStrategy(CustomerAbstract $customer)
  7. {
  8. $this->cutomer = $customer;
  9. }
  10. public function getMoney($price)
  11. {
  12. return $this->cutomer->pay($price);
  13. }
  14. }

CustomerAbstract.php

  1. <?php
  2. namespace App\Creational\Strategy;
  3. abstract class CustomerAbstract
  4. {
  5. abstract public function pay($price);
  6. }

NormalCustomer.php

  1. <?php
  2. namespace App\Creational\Strategy;
  3. class NormalCustomer extends CustomerAbstract
  4. {
  5. public function pay($price)
  6. {
  7. return $price;
  8. }
  9. }

VipCustomer.php

  1. <?php
  2. namespace App\Creational\Strategy;
  3. class VipCustomer extends CustomerAbstract
  4. {
  5. public function pay($price)
  6. {
  7. return $price - floor($price/100)*5;
  8. }
  9. }

测试代码
StrategyTest.php

  1. <?php
  2. /**
  3. * 策略模式
  4. * Class StrategyTest
  5. */
  6. class StrategyTest extends \PHPUnit\Framework\TestCase
  7. {
  8. public function testCustomer()
  9. {
  10. $price = 100;
  11. $vipCutomer = new \App\Creational\Strategy\VipCustomer();
  12. $normalCustomer = new \App\Creational\Strategy\NormalCustomer();
  13. $cashier = new \App\Creational\Strategy\Cashier();
  14. $cashier->setStrategy($vipCutomer);
  15. $this->assertEquals(95, $cashier->getMoney($price));
  16. $cashier->setStrategy($normalCustomer);
  17. $this->assertEquals(100, $cashier->getMoney($price));
  18. }
  19. }

微信扫描二维码,关注我的订阅号,回复 "电子书" 获取各类技术书籍

原文链接:http://www.cnblogs.com/echoou/p/14233163.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号