<?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
*/
?>
转载:http://www.oschina.net/code/snippet_182375_7914