zoukankan      html  css  js  c++  java
  • 策略模式(Strategy)

    策略模式(Strategy)

    策略模式定义

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

    策略模式的优点

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

    策略模式的缺点

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

    代码实现

    Cashier.php

    <?php
    
    
    namespace AppCreationalStrategy;
    
    
    class Cashier
    {
    
        private $cutomer;
    
        public function setStrategy(CustomerAbstract $customer)
        {
            $this->cutomer = $customer;
        }
    
        public function getMoney($price)
        {
            return $this->cutomer->pay($price);
        }
    }
    
    

    CustomerAbstract.php

    <?php
    
    
    namespace AppCreationalStrategy;
    
    
    abstract class CustomerAbstract
    {
        abstract public function pay($price);
    }
    
    

    NormalCustomer.php

    <?php
    
    
    namespace AppCreationalStrategy;
    
    
    class NormalCustomer extends CustomerAbstract
    {
    
        public function pay($price)
        {
            return $price;
        }
    }
    
    

    VipCustomer.php

    <?php
    
    
    namespace AppCreationalStrategy;
    
    
    class VipCustomer extends CustomerAbstract
    {
    
        public function pay($price)
        {
            return $price - floor($price/100)*5;
        }
    
    }
    
    

    测试代码
    StrategyTest.php

    <?php
    
    /**
     * 策略模式
     * Class StrategyTest
     */
    
    class StrategyTest extends PHPUnitFrameworkTestCase
    {
    
        public function testCustomer()
        {
            $price = 100;
    
            $vipCutomer = new AppCreationalStrategyVipCustomer();
            $normalCustomer = new AppCreationalStrategyNormalCustomer();
    
            $cashier = new AppCreationalStrategyCashier();
    
            $cashier->setStrategy($vipCutomer);
            $this->assertEquals(95, $cashier->getMoney($price));
    
            $cashier->setStrategy($normalCustomer);
            $this->assertEquals(100, $cashier->getMoney($price));
        }
    }
    
    

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

  • 相关阅读:
    mysql 账户管理
    关于数据库设计的思考(三)
    学习 ThinkPHP 框架笔记
    学习 Ext Js 所感
    mysql 一个较特殊的问题:You can't specify target table 'wms_cabinet_form' for update in FROM clause
    关于数据库设计的思考(二)
    flash、flex 项目开发学习时的笔记
    web.config 中SessionState的配置
    公农历转换
    使用Microsoft Web Application Stress Tool对web进行压力测试
  • 原文地址:https://www.cnblogs.com/echoou/p/14233163.html
Copyright © 2011-2022 走看看