[转] Php设计模式 - 迭代器模式、策略模式、组合模式

<?php
/* 
迭代器模式: 属于行为型模式
使用场景:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
也就是可以通过遍历数组的方式访问对象成员。
遍历有两种: 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(); ?>输出如下: 
terry831010@163.com
sanxiao@126.com


--主菜单
------菜单一
------------子菜单11
------------子菜单12
------菜单二
------菜单三
------------子菜单31
------------子菜单32

 
策略模式
我用文件存储
我从文件取数据
我用数据库存储
我从数据库取数据

posted @ 2014-06-23 17:41  zflinux21  阅读(164)  评论(0编辑  收藏  举报