[转] Php设计模式 - 迭代器模式、策略模式、组合模式
<?php
terry831010@163.com
/*
迭代器模式: 属于行为型模式
使用场景:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
也就是可以通过遍历数组的方式访问对象成员。
遍历有两种: foreach ,这种构造函数必须返回的是数组类型, 或者类似 $m->next()这样
*/
abstract class EmailAddress {
public $email = '';
function setEmail($email) {
$this->email = $email;
}
function getEmail() {
return $this->email;
}
}
// 创建三个需要被遍历的对象
class EmailAddress1 extends EmailAddress {
}
class EmailAddress2 extends EmailAddress {
}
class EmailAddress3 extends EmailAddress {
}
interface emailIterator {
function next();
}
// 迭代器类
class myIterator implements emailIterator {
public $obj_ary = array();
private $position = 0;
function __construct($obj_ary) {
$this->obj_ary = $obj_ary;
}
function next() {
if($this->position < count($this->obj_ary)) {
$obj = $this->obj_ary[$this->position];
$this->position++;
return $obj;
} return false;
}
}
$EmailAddress1 = new EmailAddress1;
$EmailAddress1->setEmail('terry831010@163.com');
$EmailAddress2 = new EmailAddress2;
$EmailAddress2->setEmail('sanxiao@126.com');
$myIterator = new myIterator(array($EmailAddress1,$EmailAddress2));
while($obj = $myIterator->next()) {
echo $obj->getEmail().'<br>';
}
/*
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。C o m p o s i t e 使得用户对单个对象和组合对象的使用具有一致性。
属于结构行模式。各对象都有共同的父类。
*/
abstract class Root {
abstract function add($item);
abstract function display();
}
class RootMenu extends Root {
private $child = array();
private $text = '';
function __construct($txt) {
$this->text = $txt;
}
function add($item) {
$this->child[] = $item;
}
function display() {
echo '--'.$this->text.'<br>';
foreach($this->child as $child) {
$child->display();
}
}
}
class Menu extends Root { private $child = array(); private $text = ''; function __construct($txt) { $this->text = $txt; } function add($item) { $this->child[] = $item; } function display() { echo '------'.$this->text.'<br>'; foreach($this->child as $child) { $child->display(); } } } class Item extends Root { private $text = ''; function __construct($txt) { $this->text = $txt; } function add($item) { } function display() { echo '------------'.$this->text.'<br>'; } } $RootMenu = new RootMenu('主菜单'); $Menu1 = new Menu('菜单一'); $Menu2 = new Menu('菜单二'); $Menu3 = new Menu('菜单三'); $Item11 = new Item('子菜单11'); $Item12 = new Item('子菜单12'); $Item31 = new Item('子菜单31'); $Item32 = new Item('子菜单32'); $Menu1->add($Item11); $Menu1->add($Item12); $Menu3->add($Item31); $Menu3->add($Item32); $RootMenu->add($Menu1); $RootMenu->add($Menu2); $RootMenu->add($Menu3); $RootMenu->display(); /* 策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 属于行为模式 */ interface cache { // 以缓存为例 function setvalue(); function getvalue(); } class FileCache implements cache { function setvalue() { echo '我用文件存储<br>'; } function getvalue() { echo '我从文件取数据<br>'; } } class DbCache implements cache { function setvalue() { echo '我用数据库存储<br>'; } function getvalue() { echo '我从数据库取数据<br>'; } } class strategy { private $obj = ''; function __construct($classname) { $this->obj = new $classname; } function set() { $this->obj->setvalue(); } function get() { $this->obj->getvalue(); } } highlight_file(__FILE__); echo '策略模式<br>'; $cache = new strategy('FileCache'); $cache->set(); $cache->get(); $cache1 = new strategy('DbCache'); $cache1->set(); $cache1->get(); ?>输出如下:
sanxiao@126.com
--主菜单
------菜单一
------------子菜单11
------------子菜单12
------菜单二
------菜单三
------------子菜单31
------------子菜单32
策略模式
我用文件存储
我从文件取数据
我用数据库存储
我从数据库取数据