设计模式-策略模式
作者:edwin
日期:2019-09-10 12:57:56
所属分类:后端 - php

(这个模式定义了一系列的算法,封装每一个,而且使它们还可以相互替换。它允许客户使且它时,算法可以独立的变化

ConcreteStrategyC(策略C)
This class implements the algorithm using the Strategy interface. 
(这个类实现了该使用策略接口中的算法。)

ConcreteStrategyB(策略B)
This class implements the algorithm using the Strategy interface. 
(这个类实现了该使用策略接口中的算法。)

ConcreteStrategyA(策略A)
This class implements the algorithm using the Strategy interface. 
(这个类实现了该使用策略接口中的算法。)

Stragey(策略)
This class declares an interface common to all supported algorithms. Context uses this interface to call the algorithm defined by a ConcreteStrategy. 
(这类给所有支持的算法声明了一个共同接口。上下文使用这个接口调用ConcreteStrategy所定义的算法。)

Context(上下文)
This class is configured with a ConcreteStrategy object, maintains a reference to a Strategy object and may define an interface that lets Strategy access its data. 
(这类配置了一个ConcreteStrategy对象,维护一个策略对象的引用,可以定义一个接口,允许策略访问其数据。)

代码实现

<?php
// 不使用缓存
class NoCache implements CacheTable
{
    public function __construct()
    {
        echo "Use NoCache";
    }

    public function get($key)
    {
        return false;
    }

    public function set($key, $value)
    {
        return true;
    }

    public function del($key)
    {
        return false;
    }
}

// 文件缓存
class FileCache implements CacheTable
{
    public function __construct()
    {
        echo "Use FileCache";
        // 文件缓存构造函数
    }

    public function get($key)
    {
        // 文件缓存的get方法实现
    }

    public function set($key, $value)
    {
        // 文件缓存的set方法实现
    }

    public function del($key)
    {
        // 文件缓存的del方法实现
    }
}

// TTServer
class TTCache implements CacheTable
{
    public function __construct()
    {
        echo "Use TTCache";
        // TTServer缓存构造函数
    }

    public function get($key)
    {
        // TTServer缓存的get方法实现
    }

    public function set($key, $value)
    {
        // TTServer缓存的set方法实现
    }

    public function del($key)
    {
        // TTServer缓存的del方法实现
    }
}

interface CacheTable
{
    public function get($key);
    public function set($key, $value);
    public function del($key);
}

class Model
{
    private $_cache;
    public function __construct()
    {
        $this->_cache = new NoCache();
    }

    public function setCache($cache)
    {
        $this->_cache = $cache;
    }
}

class PorductModel extends Model
{
    public function __construct()
    {
        $this->_cache = new TTCache();
    }
}

$mdlProduct = new PorductModel(); 
$mdlProduct->setCache(new FileCache()); // 改变缓存策略 

评论

全部评论 / 0