php与设计模式-访问者模式

访问者模式

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

Demo

<?php 
/**
* Created by PhpStorm.
*/ 

/*男人这本书的内容要比封面吸引人;女人这本书的封面通常比内容更吸引人
男人成功时,背后多半有一个伟大的女人;女人成功时,背后多半有一个失败的男人
男人失败时,闷头喝酒,谁也不用劝;女人失败时,眼泪汪汪,谁也劝不了
男人恋爱时,凡事不懂也要装懂;女人恋爱时,遇事懂也要装作不懂*/ 
//抽象状态 
abstract class State 
{ 
   protected $state_name; 

   //得到男人反应 
   public abstract function GetManAction(VMan $elementM); 
   //得到女人反应 
   public abstract function GetWomanAction(VWoman $elementW); 
} 

//抽象人 
abstract class Person 
{ 
   public $type_name; 

   public abstract function Accept(State $visitor); 
} 

//成功状态 
class Success extends State 
{ 
   public function __construct() 
   { 
       $this->state_name="成功"; 
   } 

   public  function GetManAction(VMan $elementM) 
   { 
       echo "{$elementM->type_name}:{$this->state_name}时,背后多半有一个伟大的女人。<br/>"; 
   } 

   public  function GetWomanAction(VWoman $elementW) 
   { 
       echo "{$elementW->type_name} :{$this->state_name}时,背后大多有一个不成功的男人。<br/>"; 
   } 
} 

//失败状态 
class Failure extends State 
{ 
   public function __construct() 
   { 
       $this->state_name="失败"; 
   } 

   public  function GetManAction(VMan $elementM) 
   { 
       echo "{$elementM->type_name}:{$this->state_name}时,闷头喝酒,谁也不用劝。<br/>"; 
   } 

   public  function GetWomanAction(VWoman $elementW) 
   { 
       echo "{$elementW->type_name} :{$this->state_name}时,眼泪汪汪,谁也劝不了。<br/>"; 
   } 
} 

//恋爱状态 
class Amativeness  extends State 
{ 
   public function __construct() 
   { 
       $this->state_name="恋爱"; 
   } 

   public  function GetManAction(VMan $elementM) 
   { 
       echo "{$elementM->type_name}:{$this->state_name}时,凡事不懂也要装懂。<br/>"; 
   } 

   public  function GetWomanAction(VWoman $elementW) 
   { 
       echo "{$elementW->type_name} :{$this->state_name}时,遇事懂也要装作不懂。<br/>"; 
   } 
} 

//男人 
class VMan extends Person 
{ 
   function __construct() 
   { 
       $this->type_name="男人"; 
   } 

   public  function Accept(State $visitor) 
   { 
       $visitor->GetManAction($this); 
   } 
} 

//女人 
class VWoman extends Person 
{ 
   public function __construct() 
   { 
       $this->type_name="女人"; 
   } 

   public  function Accept(State $visitor) 
   { 
       $visitor->GetWomanAction($this); 
   } 
} 

//对象结构 
class ObjectStruct 
{ 
   private $elements=array(); 
   //增加 
   public function Add(Person $element) 
   { 
       array_push($this->elements,$element); 
   } 
   //移除 
   public function Remove(Person $element) 
   { 
       foreach($this->elements as $k=>$v) 
       { 
           if($v==$element) 
           { 
               unset($this->elements[$k]); 
           } 
       } 
   } 

   //查看显示 
   public function Display(State $visitor) 
   { 
       foreach ($this->elements as $v) 
       { 
           $v->Accept($visitor); 
       } 
   } 
}

$os = new ObjectStruct(); 
$os->Add(new VMan()); 
$os->Add(new VWoman()); 

//成功时反应 
$ss = new Success(); 
$os->Display($ss); 

//失败时反应 
$fs = new Failure(); 
$os->Display($fs); 

//恋爱时反应 
$ats=new Amativeness(); 
$os->Display($ats);

请关注我的订阅号

订阅号.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值