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

isblog主页

或许不一定要做得最多,但一定要做得最好! 能力就是一种财富,积累越多,就越体现你

 
 
 

日志

 
 

PHP设计模式实例(观察者模式、策略模式、简单工厂模式)  

2012-04-25 09:43:28|  分类: PHP学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、观察者模式
/**
* 定义观察接口
*/
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 __construct($Name,$Sub)
    {
        $this->_UserName = $Name;
        $this->_Sub = $Sub;
    }
    
    public abstract function Update(); //接收通过方法
}

/**
* 观察者
*/
class StockObserver extends Observer
{
    public function __construct($name,$sub)
    {
        parent::__construct($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(); //通过所有有效的观察者

二、策略模式
/**
* 定义支持算法的接口
*
*/
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 __construct($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 Operation
{
    //存储第一个数字
    protected $_NumberA = 0;
    
    //存储第二个数字
    protected $_NumberB = 0;
    
    //存储运算结果
    protected $_Result = 0;
    
    public function __construct()
    {
        //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 OperactionSub 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 OperactionSub;
                 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);


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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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