注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Copper peas ' Bolg

Keep On Moving...This Is My Life...

 
 
 

日志

 
 

【原】 PHP 设计模式二十一之访问者设计模式  

2011-06-28 15:50:24|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

<?php
header("Content-type:text/html;charset=utf-8");
/**
 * 女人,男人 访问者设计模式
 * 定义:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
 * @anthor Chen Wei Han <csq-3@163.com>
 * @copyright Chen Wei Han 2011-6-27下午03:48:40
 * @link http://csq-3.blog.163.com
 * @package demo
 * @version 1.0
 */

/**
 * 抽象访问者类
 */
 abstract class abstract_person
 {
     abstract public function accept($state);
 }
 
/**
 * 男人
 */
class Man extends abstract_person
{
    private $person='man';
   
    public function getperson()
    {
     return $this->person;
    }
   
    public function accept($state)
 {
     $state->getstate($this);
 }
}

/**
 * 女人
 */
class Woman extends abstract_person
{
  private $person='woman';
 
  public function getperson()
     {
     return $this->person;
     }
 
     public function accept($state)
  {
    $state->getstate($this);
  }
}

/**
 * 访问者管理
 */
class  visitor
{
 private $visitor=array();
  
 public function addvisitor($visitor)
 {
         if (is_object($visitor))
         {
           $this->visitor[spl_object_hash($visitor)] = $visitor;       
         }
 }
 
    public function removevisitor($visitor)
 {
      if (is_object($visitor))
         {
          unset($this->visitor[spl_object_hash($visitor)]);
         }     
 }
 
    public function accept($state)
 {
     foreach($this->visitor as $value)    
     {
        $value->accept($state);
     }
 }
}

/**
 * 状态抽象类
 */
abstract class absctact_state
{
 abstract public function getstate($visitor);
}

/**
 * 成功时
 */
class Success extends absctact_state
{
  public function getstate($visitor)
  {
     if($visitor->getperson()=='man')
     {
      echo "男人成功,后面有一个好女人!<br>";
     }
     else
     {
        echo "女人成功,后面有一个坏男人!<br>";
     }
  }
}

/**
 * 失败时
 */
class Fail extends absctact_state
{
  public function getstate($visitor)
  {
     if($visitor->getperson()=='man')
     {
      echo "男人失败,劝也没有用!<br>";
     }
     else
     {
        echo "女人失败,越劝越伤心!<br>";
     }
  }
}

$visit = new visitor();
$woman = new Woman();
$man   = new Man();
$visit->addvisitor($woman);
$visit->addvisitor($man);

$success =new Success();
$visit->accept($success);

$fail =new Fail();
$visit->accept($fail);

/*
 * 优点是:增加状态,只需要增加一个状态类即可
 * 缺点是:增加人的类别,需要在修改每个状态类,
 * 所以使用访问者模式,类别一般是固定的,不易更改的。
 * 注:可以把状态下面在细化类,就可以满足无限扩展
 * eg:success中的ifelse判断分成2个子类,采用获取类名动态调用对应的子类方法,就可以实现,增加状态和人的类型都不用修改原程序,
 * 而是增加新子类,但这样子类的量后期是非常的大的,还是根据实际情况来使用吧。
 */

  评论这张
 
阅读(301)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018