php 访问者模式代码学习

abstract class Action {//visitor
	abstract public function GetManConclusion($person);
	abstract public function GetWomanConclusion($person);
}
class Success extends Action {
	public function GetManConclusion($person) {
		echo get_class($person) . " 背后多半有一个伟大的女人<br/>";//get_class,返回对象的类名
	}
	public function GetWomanConclusion($person) {
		echo get_class($person) . " 背后大多有一个不成功的男人<br/>";
	}
}
class Failing extends Action {
	public function GetManConclusion($person) {
		echo get_class($person) . " 大醉一场<br/>";
	}
	public function GetWomanConclusion($person) {
		echo get_class($person) . "哭的天翻地覆<br/>";
	}
}
class Marry extends Action{
	public function GetManConclusion($person){
		echo get_class($person)."结束了爱情游戏<br/>";
	}
	public function GetWomanConclusion($person){
		echo get_class($person)."找到了归属<br/>";
	}
}
abstract class Person {//elements
	abstract public function accept($action);
}
class Man extends Person {
	public function accept($action) {
		$action->GetManConclusion($this);
	}
}
class Woman extends Person {
	public function accept($action) {
		$action->GetWomanConclusion($this);
	}
}
class ObjectStructure {
	private $_elements = array ();
	public function attach($person) {
		$this->_elements[] = $person;
	}
	public function detach($person) {
		if ($key = array_search($person, $this->_elements) !== false)
			unset ($this->_elements[$key]);//销毁单个数组元素
	}
	public function accept($action) {
		foreach ($this->_elements as $element) {
			$element->accept($action);
		}
	}
}
//
$objOS = new ObjectStructure();
$objOS->attach(new Man());
$objOS->attach(new Woman());
$objCV1 = new Success();
$objCV2 = new Failing();
$objCV3 = new Marry();
$objOS->accept($objCV1);
$objOS->accept($objCV2);
$objOS->accept($objCV3);


输出结果:

Man 背后多半有一个伟大的女人

Woman 背后大多有一个不成功的男人

Man 大醉一场

Woman哭的天翻地覆

Man结束了爱情游戏

Woman找到了归属

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值