龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

PHP 【新】php 设计模式-策略模式

时间:2015-03-29 11:29来源:网络整理 作者:网络 点击:
分享到:
【新】php 设计模式-策略模式 原文链接:http://www.oschina.net/code/snippet_182375_7857有朋友问该模式具体应用场景的问题,可能是我上面的那个提到的应用场景不够典型,大家没太看懂。这里我

原文链接:http://www.oschina.net/code/snippet_182375_7857有朋友问该模式具体应用场景的问题,可能是我上面的那个 提到的应用场景不够典型,大家没太看懂。这里我重新设置了一种场景.即,在php和mysql中最常见的,数据源存储的功能.场景:在项目中,我们需要把数据保存起来 ,大多数时候需要保存到数据库,有时也要保存成文件,也有可能你的经理心血来潮,让你把一些数据保存到NOSQL数据库如mongoDB .针对这种情况,我们要把数据的保存方式(本例interface data_source)从事件处理(本例 class control)中分离。并且有一个决策者(本例 class strategy)能根据要求找到相应的数据保存方式。

test8.php

<?php
/** ******************************************************
 * 策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,    
 * 从而使得它们可以相互替换。策略模式使得算法可以 在不影响到客户端的情况下发生变化。
 * 策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。
 * 由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。
 * *********************************************************
 */
/**
 * 数据源保存方式接口
 * 定义了数据源操作的四种基本方式 (增,删,改,查)
 */
interface data_source {
    public function add();
    public function delete();
    public function update();
    public function find();
}
/**
 * 数据库保存方式具体类
 * 具体的数据源接口的一种形式,该形式是把数据保存到数据库
 */
class db_source implements data_source {
    public function add() {
        // 在这里写把数据插入数据库的代码
        echo "增加数据到数据库";
    }
    public function delete() {
        // 在这里写把数据从数据库删除的代码
        echo "删除数据";
    }
    public function update() {
        // 在这里写修改数据库中的数据的代码
        echo "修改数据";
    }
    public function find() {
        // 在这里从数据库查找数据代码
        echo "查找数据";
    }
}
/**
 * 文件保存方式具体类
 * 具体的数据源接口的另一种形式,该形式是把数据保存到文件
 */
class file_source implements data_source {
    public function add() {
        // 在这里写把数据插入文件的代码
        echo "增加数据到文件";
    }
    public function delete() {
        // 在这里写把数据从文件删除的代码
        echo "删除数据";
    }
    public function update() {
        // 在这里写修改文件中的数据的代码
        echo "修改数据";
    }
    public function find() {
        // 在这里从文件查找数据代码
        echo "查找数据";
    }
}
/*#*********************************#
 *  当然你还可以增加别的数据保存方式,比如芒果DB                             *                   
 *                                  *               
 * ##################################
 */
/*  
    mongodb保存方式具体类
    该形式是把数据保存到mongodb
 class mongodb_source implements data_source {
    public function add() {
        // 在这里写把数据插入文件的代码
        echo "增加数据到mongodb";
    }
    public function delete() {
        // 在这里写把数据从文件删除的代码
        echo "删除数据";
    }
    public function update() {
        // 在这里写修改文件中的数据的代码
        echo "修改数据";
    }
    public function find() {
        // 在这里从文件查找数据代码
        echo "查找数据";
    }
}
 */
/**
 * 策略类
 * 该类根据要求返回符合要求类别的的数据源
 * 本例 $strategyName = db_source 或者 $strategyName = file_source
 */
class strategy {
    // 当然项目的实际应用情况可能比较复杂经过一系列的逻辑处理才能返回符合要求的实例,
    // 这里只是演示,所以体现了最简单的情况
    public function getInstance($strategyName) {
        return new $strategyName;
    }
}
/**
 * 主体事件处理类 
 */
class control {
    private $datasource;
    public function __construct($strategyName) {
        // 策略者根据 要求($strategyName)经过内部决策生成一种实例
        $this->datasource = strategy::getInstance($strategyName);
    }
    // 逻辑处理
    public function add() {
        $this->datasource->add();
    }
} 
// 测试代码 
//1:
$control = new control("db_source");
$control->add();
// return 增加数据到数据库
//2:
$control = new control("file_source");
$control->add();
// return 增加数据到文件
//3:
/* 
 * $control = new control("mongodb_source");
 * $control->add();
 *  return 增加数据到mongodb
 */

?>

精彩图集

赞助商链接