php设计模式 Strategy(策略模式)

5年以前  |  阅读数:224 次  |  编程语言:PHP 

抽象策略(Strategy)角色:定义所有支持的算法的公共接口。通常是以一个接口或抽象来实现。Context使用这个接口来调用其ConcreteStrategy定义的算法。

具体策略(ConcreteStrategy)角色:以Strategy接口实现某具体算法。

环境(Context)角色:持有一个Strategy类的引用,用一个ConcreteStrategy对象来配置

核心代码


    <?php
    interface Strategy { // 抽象策略角色,以接口实现
      public function algorithmInterface(); // 算法接口
    }

    class ConcreteStrategyA implements Strategy { // 具体策略角色A 
      public function algorithmInterface() {}
    }

    class ConcreteStrategyB implements Strategy { // 具体策略角色B 
      public function algorithmInterface() {}
    }

    class ConcreteStrategyC implements Strategy { // 具体策略角色C
      public function algorithmInterface() {}
    }

    class Context { // 环境角色
      private $_strategy;
      public function __construct(Strategy $strategy) {
        $this->_strategy = $strategy;
      } 
      public function contextInterface() {
        $this->_strategy->algorithmInterface();
      }
    }

    // client
    $strategyA = new ConcreteStrategyA();
    $context = new Context($strategyA);
    $context->contextInterface();

    $strategyB = new ConcreteStrategyB();
    $context = new Context($strategyB);
    $context->contextInterface();

    $strategyC = new ConcreteStrategyC();
    $context = new Context($strategyC);
    $context->contextInterface();

其他代码


    <?php 
    /** 
    * 策略模式(Strategy.php) 
    * 
    * 定义一系列算法,把它们一个个封装起来,并且使它们可相互替换,使用得算法的变化可独立于使用它的客户 
    * 
    */ 

    // ---以下是一系列算法的封闭---- 
    interface CacheTable 
    { 
    public function get($key); 
    public function set($key,$value); 
    public function del($key); 
    } 

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

    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<br/>"; 
    // 文件缓存构造函数 
    } 

    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<br/>"; 
    // TTServer缓存构造函数 
    } 

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

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

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

    // -- 以下是使用不用缓存的策略 ------ 
    class Model 
    { 
    private $_cache; 
    public function __construct() 
    { 
    $this->_cache = new NoCache(); 
    } 

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

    class UserModel extends Model 
    { 
    } 

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

    // -- 实例一下 --- 
    $mdlUser = new UserModel(); 
    $mdlProduct = new PorductModel(); 
    $mdlProduct->setCache(new FileCache()); // 改变缓存策略 
    ?>

具体的大家可以多关注一下脚本之家以前发布的文章

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例