策略模式

Posted waterliang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了策略模式相关的知识,希望对你有一定的参考价值。

首先建立策略接口类,这是基础接口,所有的业务逻辑都必须要实现这个接口定义的方法

<?php
/**
 * Created by IntelliJ IDEA.
 * User: root
 * Date: 2020/2/18 0018
 * Time: 下午 23:12
 */

namespace app;

/**
 * 策略接口
 */
interface UserStrategy
{
    /**
     * 广告
     * @return mixed
     */
    public function ad();

    /**
     * 类目
     * @return mixed
     */
    public function category();
}

 

建立具体的业务策略

1. 女性客户策略

<?php
/**
 * Created by IntelliJ IDEA.
 * User: root
 * Date: 2020/2/18 0018
 * Time: 下午 23:12
 */

namespace app;

/**
 * 女性策略类
 * Class FemaleStrategy
 * @package app
 */
class StrategyFemale implements UserStrategy
{
    /**
     * 广告
     */
    public function ad()
    {
        echo "这是女性客户广告";
    }

    /**
     * 类名
     */
    public function category()
    {
        echo "这是女性客户产品类目";
    }
}

 

2. 男性客户策略

<?php
/**
 * Created by IntelliJ IDEA.
 * User: root
 * Date: 2020/2/18 0018
 * Time: 下午 23:12
 */

namespace app;

/**
 * 男性策略类
 * Class StrategyFemale
 * @package app
 */
class StrategyMale implements UserStrategy
{
    /**
     * 广告
     */
    public function ad()
    {
        echo "这是男性客户广告";
    }

    /**
     * 类名
     */
    public function category()
    {
        echo "这是男性客户产品类目";
    }
}

 

定义好策略之后开始使用,需要定义使用入口(如果这一层不要我个人感觉就变成了适配器模式)

<?php
/**
 * Created by IntelliJ IDEA.
 * User: root
 * Date: 2020/2/18 0018
 * Time: 下午 23:12
 */

namespace app;

/**
 * 策略使用入口
 * Class StrategyEntry
 * @package app
 */
class StrategyEntry
{
    /**
     * 策略属性
     */
    protected $strategy;

    /**
     * 设置策略属性
     * @param $strategy
     */
    public function setStrategy($strategy)
    {
        $this->strategy = $strategy;
    }

    /**
     * 显示内容
     */
    public function show()
    {
        // 广告
        $this->strategy->ad();
        echo "<br>";
        // 类目
        $this->strategy->category();
    }

}

 

开始使用

<?php

// 定义自动注册
spl_autoload_register(function ($class) {
    include $class . ‘.php‘;
});

// 实例化策略入口
$gender = isset($_GET[‘female‘]) ? $_GET[‘female‘] : ‘‘;
$entry = new appStrategyEntry();
// 根据不同性别来显示不同用户群体的策略内容
if ($gender == ‘female‘) {
    $strategy = new appStrategyFemale();
} else {
    $strategy = new appStrategyMale();
}
// 设置策略
$entry->setStrategy($strategy);
// 显示内容
$entry->show();

 

以上,我感觉策略模式就是在适配器模式的基础上多加了一层策略入口的封装,很相似

 

以上是关于策略模式的主要内容,如果未能解决你的问题,请参考以下文章

Redis实现分布式锁(设计模式应用实战)

用于从 cloudkit 检索单列的代码模式/片段

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式