设计模式之策略模式

策略模式

策略模式与简单工厂模式代码类似,但是核心类的思路迥异(后文介绍)

策略模式主要是应对算法的频繁改动。

例如:一个简易的计算器只有加减乘除等几个功能,算法固定,所以可以使用简单工厂模式。但是面对类似于商场活动这种需要频繁更改的需求,简单工厂模式就需要频繁更改工厂类以满足其需求(显然这不是我们期望的)。所以策略模式出现了。

1、创建抽象类

<?php

/**
 * 抽象活动算法类
 */
namespace strategy;

abstract class StrategyAbstract
{
    /**
     * 具体活动算法方法
     * @return mixed
     */
    public abstract function doAction($money);
}

2、创建具体算法类

<?php

/**
 * 满减算法产品类
 */
namespace strategy;

class ManJianStrategy extends StrategyAbstract
{
    public function doAction($money)
    {
        echo '满减算法:原价'. $money .'元';
    }
}

/**
 * 打折算法产品类
 */
namespace strategy;

class DaZheStrategy extends StrategyAbstract
{
    /**
     * 具体算法实现
     * @param $money
     * @return mixed|void
     */
    public function doAction($money)
    {
        echo '打折算法:原价'. $money .'元';
    }
}

3、策略工厂类

<?php
/**
 * 策略工厂类
 */
namespace strategy;

class StrategyFind
{
    private $strategy_mode;

    /**
     * 初始时,传入具体的策略对象
     * @param $mode
     */
    public function __construct($mode)
    {
        $this->strategy_mode = $mode;
    }

    /**
     * 执行打折算法
     * @param $money
     */
    public function get($money)
    {
        $this->strategy_mode->doAction($money);
    }
}

4、模拟客户端

<?php

namespace strategy;

include '../autoload.php';
// 满减折算
$mode1 = new StrategyFind(new ManJianStrategy());
$mode1->get(100);

echo '<br>';

// 满减活动
$mode2= new StrategyFind(new DaZheStrategy());
$mode2->get(100);

 

心得:

相对于简单工厂模式来说,祸水转移,将选择交给客户端完成。

(1)简单工厂模式是将实例化的对象交给客户端进行操作,而策略模式将运算的结果返回给客户端

(2)简单工厂模式是在核心类中进行选择实例化某个类,而策略模式的StrategyFind类则只管实例化运算类,选择权交给客户端完成

 

posted @ 2019-05-28 14:08  sfengz  阅读(189)  评论(0编辑  收藏  举报