PHP设计模式实例之(观察者模式、策略模式、简单工厂模式)
时间:2008-09-08
来源:互联网
有太多的人想了解设计模式,今天无事在此发表一下,希望对想了解设计模式的道友有所帮助,觉的好的朋友帮忙顶一下,让更多的朋友一起来了解
观察者模式
/**
* 定义观察接口
*/
interface Subject
{
public function Attach($Observer); //添加观察者
public function Detach($Observer); //踢出观察者
public function Notify(); //满足条件时通知观察者
public function SubjectState($Subject); //观察条件
}
/**
* 观察类的具体实现
*/
class Boss Implements Subject
{
public $_action;
private $_Observer;
public function Attach($Observer)
{
$this->_Observer[] = $Observer;
}
public function Detach($Observer)
{
$ObserverKey = array_search($Observer, $this->_Observer);
if($ObserverKey !== false)
{
unset($this->_Observer[$ObserverKey]);
}
}
public function Notify()
{
foreach($this->_Observer as $value )
{
$value->Update();
}
}
public function SubjectState($Subject)
{
$this->_action = $Subject;
}
}
/**
* 抽象观察者
*
*/
abstract class Observer
{
protected $_UserName;
protected $_Sub;
public function __c****truct($Name,$Sub)
{
$this->_UserName = $Name;
$this->_Sub = $Sub;
}
public abstract function Update(); //接收通过方法
}
/**
* 观察者
*/
class StockObserver extends Observer
{
public function __c****truct($name,$sub)
{
parent::__c****truct($name,$sub);
}
public function Update()
{
echo $this->_Sub->_action.$this->_UserName.\" 你赶快跑...\";
}
}
$huhansan = new Boss(); //被观察者
$gongshil = new StockObserver(\"三毛\",$huhansan); //初始化观察者
$huhansan->Attach($gongshil); //添加一个观察者
$huhansan->Attach($gongshil); //添加一个相同的观察者
$huhansan->Detach($gongshil); //踢出基中一个观察者
$huhansan->SubjectState(\"警察来了\"); //达到满足的条件
$huhansan->Notify(); //通过所有有效的观察者
观察者模式
/**
* 定义观察接口
*/
interface Subject
{
public function Attach($Observer); //添加观察者
public function Detach($Observer); //踢出观察者
public function Notify(); //满足条件时通知观察者
public function SubjectState($Subject); //观察条件
}
/**
* 观察类的具体实现
*/
class Boss Implements Subject
{
public $_action;
private $_Observer;
public function Attach($Observer)
{
$this->_Observer[] = $Observer;
}
public function Detach($Observer)
{
$ObserverKey = array_search($Observer, $this->_Observer);
if($ObserverKey !== false)
{
unset($this->_Observer[$ObserverKey]);
}
}
public function Notify()
{
foreach($this->_Observer as $value )
{
$value->Update();
}
}
public function SubjectState($Subject)
{
$this->_action = $Subject;
}
}
/**
* 抽象观察者
*
*/
abstract class Observer
{
protected $_UserName;
protected $_Sub;
public function __c****truct($Name,$Sub)
{
$this->_UserName = $Name;
$this->_Sub = $Sub;
}
public abstract function Update(); //接收通过方法
}
/**
* 观察者
*/
class StockObserver extends Observer
{
public function __c****truct($name,$sub)
{
parent::__c****truct($name,$sub);
}
public function Update()
{
echo $this->_Sub->_action.$this->_UserName.\" 你赶快跑...\";
}
}
$huhansan = new Boss(); //被观察者
$gongshil = new StockObserver(\"三毛\",$huhansan); //初始化观察者
$huhansan->Attach($gongshil); //添加一个观察者
$huhansan->Attach($gongshil); //添加一个相同的观察者
$huhansan->Detach($gongshil); //踢出基中一个观察者
$huhansan->SubjectState(\"警察来了\"); //达到满足的条件
$huhansan->Notify(); //通过所有有效的观察者
作者: 蓝水宝盒 发布时间: 2008-09-08
策略模式
/**
* 定义支持算法的接口
*
*/
abstract class Strategy
{
abstract public function AlgorithmInterface();
}
class ConcreateStratA extends Strategy
{
public function AlgorithmInterface()
{
echo \"算法A\";
}
}
class ConcreateStratB extends Strategy
{
public function AlgorithmInterface()
{
echo \"算法B\";
}
}
class ConcreateStratC extends Strategy
{
public function AlgorithmInterface()
{
echo \"算法C\";
}
}
class Context
{
private $_StrObj;
public function __c****truct($strobj)
{
$this->_StrObj = $strobj;
}
public function ContextInterface()
{
$this->_StrObj->AlgorithmInterface();
}
}
$context = new Context(new ConcreateStratA);
$context->ContextInterface();
$context = new Context(new ConcreateStratC);
$context->ContextInterface();
$context = new Context(new ConcreateStratB);
$context->ContextInterface();
/**
* 定义支持算法的接口
*
*/
abstract class Strategy
{
abstract public function AlgorithmInterface();
}
class ConcreateStratA extends Strategy
{
public function AlgorithmInterface()
{
echo \"算法A\";
}
}
class ConcreateStratB extends Strategy
{
public function AlgorithmInterface()
{
echo \"算法B\";
}
}
class ConcreateStratC extends Strategy
{
public function AlgorithmInterface()
{
echo \"算法C\";
}
}
class Context
{
private $_StrObj;
public function __c****truct($strobj)
{
$this->_StrObj = $strobj;
}
public function ContextInterface()
{
$this->_StrObj->AlgorithmInterface();
}
}
$context = new Context(new ConcreateStratA);
$context->ContextInterface();
$context = new Context(new ConcreateStratC);
$context->ContextInterface();
$context = new Context(new ConcreateStratB);
$context->ContextInterface();
作者: 蓝水宝盒 发布时间: 2008-09-08
简单工厂模式
/**
* 定义运算类
*
*/
abstract class Operation
{
//存储第一个数字
protected $_NumberA = 0;
//存储第二个数字
protected $_NumberB = 0;
//存储运算结果
protected $_Result = 0;
public function __c****truct()
{
//empty
}
/**
* 设定需要运行的二个数字
*
* @param 第一个数字 $A
* @param 第二个数字 $B
*/
public function SetNumber($A=0,$B=0)
{
$this->_NumberA = $A;
$this->_NumberB = $B;
}
/**
* 清除所有数据
*
*/
protected function ClearResult()
{
$this->_Result = 0;
}
abstract function GetResult();
}
/**
* 数据相加
*/
class OperactionAdd extends Operation
{
public function GetResult()
{
$this->_Result = $this->_NumberA + $this->_NumberB;
return $this->_Result;
}
}
/**
* 数据相减
*/
class Operacti****ub extends Operation
{
public function GetResult()
{
$this->_Result = $this->_NumberA - $this->_NumberB;
return $this->_Result;
}
}
/**
* 数据相乘
*/
class OperactionMul extends Operation
{
public function GetResult()
{
$this->_Result = $this->_NumberA * $this->_NumberB;
return $this->_Result;
}
}
/**
* 数据相除
*/
class OperactionDiv extends Operation
{
public function GetResult()
{
$this->_Result = $this->_NumberA / $this->_NumberB;
return $this->_Result;
}
}
class OperactionFactory
{
private static $_Obj;
public static function CreateOperaction($type)
{
switch($type)
{
case \"+\":
self:
_Obj = new OperactionAdd;
break;
case \"-\":
self:
_Obj = new Operacti****ub;
break;
case \"*\":
self:
_Obj = new OperactionMul;
break;
case \"/\":
self:
_Obj = new OperactionDiv;
break;
}
return self:
_Obj;
}
}
$Obj = OperactionFactory::CreateOperaction(\"*\");
$Obj->SetNumber(6,4);
$num = $Obj->GetResult();
var_dump($num);
/**
* 定义运算类
*
*/
abstract class Operation
{
//存储第一个数字
protected $_NumberA = 0;
//存储第二个数字
protected $_NumberB = 0;
//存储运算结果
protected $_Result = 0;
public function __c****truct()
{
//empty
}
/**
* 设定需要运行的二个数字
*
* @param 第一个数字 $A
* @param 第二个数字 $B
*/
public function SetNumber($A=0,$B=0)
{
$this->_NumberA = $A;
$this->_NumberB = $B;
}
/**
* 清除所有数据
*
*/
protected function ClearResult()
{
$this->_Result = 0;
}
abstract function GetResult();
}
/**
* 数据相加
*/
class OperactionAdd extends Operation
{
public function GetResult()
{
$this->_Result = $this->_NumberA + $this->_NumberB;
return $this->_Result;
}
}
/**
* 数据相减
*/
class Operacti****ub extends Operation
{
public function GetResult()
{
$this->_Result = $this->_NumberA - $this->_NumberB;
return $this->_Result;
}
}
/**
* 数据相乘
*/
class OperactionMul extends Operation
{
public function GetResult()
{
$this->_Result = $this->_NumberA * $this->_NumberB;
return $this->_Result;
}
}
/**
* 数据相除
*/
class OperactionDiv extends Operation
{
public function GetResult()
{
$this->_Result = $this->_NumberA / $this->_NumberB;
return $this->_Result;
}
}
class OperactionFactory
{
private static $_Obj;
public static function CreateOperaction($type)
{
switch($type)
{
case \"+\":
self:

break;
case \"-\":
self:

break;
case \"*\":
self:

break;
case \"/\":
self:

break;
}
return self:

}
}
$Obj = OperactionFactory::CreateOperaction(\"*\");
$Obj->SetNumber(6,4);
$num = $Obj->GetResult();
var_dump($num);
作者: 蓝水宝盒 发布时间: 2008-09-08
学习学习,再学习,。。。。。呵呵
作者: dragonzerogz 发布时间: 2008-09-09
没明白你的意思............
作者: zjw787 发布时间: 2008-09-10
PHP是好东西,大家一起学习
作者: xychina1006 发布时间: 2008-09-10
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28