资源描述
利用抽象工厂模式和策略模式组织网站业务模型层的实践
张亚南
在网站制作过程中,我们可能遇到不同的对象进行不同处理的。如何做到代码复用的最大化,提高开发速度?
软件设计思想中重要的设计原则可以给我们一些提示。
1、 分离变化。网站中,表结构在变化,但是对表的操作无非增删查改,因此我们有了将数据库结构和数据操作分开的想法,于是有了Row类及其不断变化的子类和不变的Db类。对于一个数据结构既定的网站,其资源一定,当时对资源的操作随着需求变化而不断增加,因此我们有理由将资源对象获取合适的资源操作方法与具体的资源操作方法分开。并有资源根据需求去注册资源操作方法。这是抽象工厂模式。丰富网站功能就是丰富资源操作方法,每个操作方法就是一个一种业务。编写大量的业务集合供控制层调用,这是策略模式。控制层根据用户请求,才做不同的资源,使用不同的方法。
2、 编程过程中针对Recourse和ActionAdapter两个抽象类进行操作,无论当前是什么操作方法,自用调用对应的接口方法,就可以了。这符合针对接口编程的原则。
一、 模型
二、 重要源码
1、 Recourse 类 资源类
abstract class recourse{
var $row;
var $db ;
const LOCK = 1;//锁定
const UNLOCK = 2;//解锁
const ADDNEW = 3;//添加
const DELETE = 4;//删除
//……
abstract function getAction($type);
function setRow($row){
$this->row = $row;
}
function __construct($db,$row){
$this->db = $db;
$this->setRow($row);
}
}
2、 ActionAdapter 类 资源操作类 data的形式、规格需要事先说明
abstract class ActionAdapter {
var $recourse = null;
var $data = null;
function setRecourse($recourse){
$this->recourse = $recourse;
}
function setData($data){
$this->data = $data;
}
abstract function checkData();
abstract function run();
function __construct($recourse=null,$data=null){
if($recourse)
$this->setRecourse($recourse);
if($data)
$this->setData($data);
}
}
三、 测试方法
1、 ArticleObj类 一种资源,重写getAction方法,是变化的部分
class ArticleObj extends Recourse{
function getAdapt ($type){
$action = null;
switch($type){
case Recourse::DELETE :
include_once dirname(__FILE__)."/ArticleRemoveAdapter.php";
$action = new ArticleRemoveAdapter($this);
break;
//……
}
if($action == null){
throw Exception("您的请求不正确",1);
}
return $action;
}
}
2、 ArticleRemoveAdapter类 具体的资源操作方法,是不变的部分。Data应该是一个对应的id。
class ArticleRemoveAdapter extends ActionAdapter{
public function run(){
if(!$this->checkData()){
throw Exception("数据不符合要求",2);
}
foreach($this->recourse->row->col as $value){
$value->colValue = null;
}
$head = $this->recourse->row->getHead(); //获取字段头
$this->recourse->row->col[$head."id"]->colValue=$this->data;
//调用Db的删除方法,删除id对应的资源
return $this->recourse->db->delete(
$this->recourse->row,$this->recourse->row->col[$head."id"]);
}
//根据实际需求,重写数据完整性检查方法
public function checkData(){
return DataCheck::checkInteger($this->data);
}
}
3、 主流程
//建立数据库连接
$db = new Db("mysql:host=localhost;dbname=db","user","password");
//实例化数据库结构类
$art = new Article();
//实例化一个文章资源对象
$ ArticleObj = new ArticleObj ($db,$art);
//文章资源对象中获取对应删除操作的操作类
$ ArticleObjRemoveAdapt = $ ArticleObj->getAdapt(recourse::DELETE);
//向操作类中填入数据
$id = 1;
$ ArticleObjRemoveAdapt->setData($id);
//检查数据的完整性
if($ArticleObjRemoveAdapt->checkData()){
//将动作完成
echo $ArticleObjRemoveAdapt->run();
echo "OK";
}
else{
echo "CheckDataError";
}
展开阅读全文