`
cyber4cn
  • 浏览: 39271 次
社区版块
存档分类
最新评论

Php设计模式:行为型模式(三)

阅读更多

原文详见:http://www.ucai.cn/blogdetail/7023?mid=1&f=12

 可以在线运行查看效果哦!    

 

<接上一篇>

7、职责链模式 (Chainof Responsibility):

         多个对象有机会处理请求,为请求发送者和接收者解耦。就像银行里的取款机,不管那一台都可以取到钱。

         好处:简单化对象隐藏链结构,便于添加新职责节点。

         弊端:请求可能没有接受者,或者被多个接收者调用,性能降低。

         应用场景:处理多种请求。

代码实现:

<?php

/**
 * 优才网公开课示例代码
 *
 * 职责链模式 Chain of Responsibility
 *
 * @author 优才网全栈工程师教研组
 * @see http://www.ucai.cn
 */

function output($string) {
    echo    $string . "\n";
}

/** 
 * 加入在公司里,如果你的请假时间小于0.5天,那么只需要向leader打声招呼就OK了。 
  如果0.5<=请假天数<=3天,需要先leader打声招呼,然后部门经理签字。 
  如果3<请假天数,需要先leader打声招呼,然后到部门经理签字,最后总经经理确认签字, 
    如果请假天数超过10天,是任何人都不能批准的。
 */ 

  
/** 
 * 抽象处理者角色(Handler:Approver):定义一个处理请求的接口,和一个后继连接(可选) 
 * 
 */  
abstract class Handler 
{  

    protected $_handler = null;  
    protected $_handlerName = null;  
      
    public function setSuccessor($handler)  
    {  
        $this->_handler = $handler;  
    }  
      
    protected  function _success($request)  
    {  
        output(sprintf("%s's request was passed", $request->getName())); 
        return true;  
    }  
    abstract function handleRequest($request);  
}  

/** 
 * 具体处理者角色(ConcreteHandler:President):处理它所负责的请求,可以访问后继者,如果可以处理请求则处理,否则将该请求转给他的后继者。 
 * 
 */  
class ConcreteHandlerLeader extends Handler  
{  
    function __construct($handlerName){  
        $this->_handlerName = $handlerName;  
    }  
    public function handleRequest($request)  
    {  
        if($request->getDay() < 0.5) {  
            output(sprintf('%s was told', $this->_handlerName));       // 已经跟leader招呼了
            return $this->_success($request);  
        }   
        if ($this->_handler instanceof Handler) {  
            return $this->_handler->handleRequest($request);  
        }  
    }  
}  
/** 
 * Manager 
 * 
 */  
class ConcreteHandlerManager extends Handler  
{  
    function __construct($handlerName){  
        $this->_handlerName = $handlerName;  
    }  
      
    public function handleRequest($request)  
    {  
        if(0.5 <= $request->getDay() && $request->getDay()<=3) {  
            output(sprintf('%s signed', $this->_handlerName));       // 部门经理签字
            return $this->_success($request);  
        }   
        if ($this->_handler instanceof Handler) {  
            return $this->_handler->handleRequest($request);  
        }  
    }  

}  

class ConcreteHandlerGeneralManager extends Handler  
{  
    function __construct($handlerName){  
        $this->_handlerName = $handlerName;  
    }  
      
    public function handleRequest($request)  
    {  
        if(3 < $request->getDay() && $request->getDay() < 10){  
            output(sprintf('%s signed', $this->_handlerName));       // 总经理签字
            return $this->_success($request);  
        }  
        if ($this->_handler instanceof Handler) {  
            return $this->_handler->handleRequest($request);  
        } else {
            output(sprintf('no one can approve request more than 10 days'));
        }
    }  

}  

/** 
 * 请假申请 
 * 
 */  
class Request  
{  
    private $_name;  
    private $_day;  
    private $_reason;  
  
    function __construct($name= '', $day= 0, $reason = ''){  
        $this->_name = $name;  
        $this->_day = $day;  
        $this->_reason = $reason;  
    }  
      
    public function setName($name){  
        $this->_name = $name;  
    }  

    public function getName(){  
        return  $this->_name;  
    }  
      
    public function setDay($day){  
        $this->_day = $day;  
    }  

    public function getDay(){  
        return  $this->_day ;  
    }  
      
    public function setReason($reason ){  
         $this->_reason = $reason;  
    }  

    public function getReason( ){  
        return  $this->_reason;  
    }  
}  
  
  
class Client {  
      
    public static function test(){  
          
        $leader = new ConcreteHandlerLeader('leader');  
        $manager = new ConcreteHandlerManager('manager');  
        $generalManager = new ConcreteHandlerGeneralManager('generalManager');  
          
        //请求实例  
        $request = new Request('ucai',4,'休息');  
          
        $leader->setSuccessor($manager);  
        $manager->setSuccessor($generalManager);  
        $result =  $leader->handleRequest($request);  
    }  
      
}  
  
Client::test(); 

 

8、策略模式(Strategy):

        定义一系列算法,把每一个算法封装起来,并且使它们可相互替换。就像篮球队里的球员,场上的和场下休息的。教练可以让场上的下来,也可以让场下的上阵。

        好处:定义可重用的一系列算法和行为,并且消除了if else语句。

        弊端:调用端必须知道所有策略类。

        应用场景:用于对象间的替换。

代码实现:

<?php

/**
 * 优才网公开课示例代码
 *
 * 策略模式 Strategy
 *
 * @author 优才网全栈工程师教研组
 * @see http://www.ucai.cn
 */


function output($string) {
    echo    $string . "\n";
}

//策略基类接口

interface IStrategy {
    public function OnTheWay();
}

class WalkStrategy implements IStrategy {
    public function OnTheWay() {
        output( '在路上步行');
    }
}

class RideBickStrategy implements IStrategy {
    public function OnTheWay() {
        output( '在路上骑自行车');
    }
}

class CarStrategy implements IStrategy {
    public function OnTheWay() {
        output( '在路上开车');
    }
}

//选择策略类Context
class Context {
    public function find($strategy) {
        $strategy->OnTheWay();
    }
}

class Client {  
      
    public static function test(){  

        $travel = new Context();
        $travel->find(new WalkStrategy());
        $travel->find(new RideBickStrategy());
        $travel->find(new CarStrategy());

    }  
      
}  
  
Client::test(); 

 

已知模式

1、备忘录模式(Memento):

         保存对象在一时刻的状态。亲,还记得“老师来了记得叫我一下”的同桌的他吗?

         好处:给用户提供了一种可以恢复状态的机制。

         弊端:消耗资源。

         应用场景:用于需要保存的数据。

代码实现:

<?php

/**
 * 优才网公开课示例代码
 *
 * 备忘录模式 Memento
 *
 * @author 优才网全栈工程师教研组
 * @see http://www.ucai.cn
 */

function output($string) {
    echo    $string . "\n";
}


class Originator { // 发起人(Originator)角色
    private $_state;
    public function __construct() {
        $this->_state = '';
    }
    public function createMemento() { // 创建备忘录
        return new Memento($this->_state);
    }
    public function restoreMemento(Memento $memento) { // 将发起人恢复到备忘录对象记录的状态上
        $this->_state = $memento->getState();
    }
    public function setState($state) { $this->_state = $state; } 
    public function getState() { return $this->_state; }
    public function showState() {
        output($this->_state);
    }

}

class Memento { // 备忘录(Memento)角色 
    private $_state;
    public function __construct($state) {
        $this->setState($state);
    }
    public function getState() { return $this->_state; } 
    public function setState($state) { $this->_state = $state;}
}

class Caretaker { // 负责人(Caretaker)角色 
    private $_memento;
    public function getMemento() { return $this->_memento; } 
    public function setMemento(Memento $memento) { $this->_memento = $memento; }
}

class Client {  
      
    public static function test(){  

        $org = new Originator();
        $org->setState('open');
        $org->showState();

        /* 创建备忘 */
        $memento = $org->createMemento();

        /* 通过Caretaker保存此备忘 */
        $caretaker = new Caretaker();
        $caretaker->setMemento($memento);

        /* 改变目标对象的状态 */
        $org->setState('close');
        $org->showState();

        /* 还原操作 */
        $org->restoreMemento($caretaker->getMemento());
        $org->showState();

    }  
      
}  
  
Client::test(); 


return;


try {

    $db->beginTransaction();

    $succ   = $db->exec($sql_1);
    if (!$succ) {
        throw new Exception('SQL 1 update failed');
    }

    $succ   = $db->exec($sql_2);
    if (!$succ) {
        throw new Exception('SQL 2 update failed');
    }

    $succ   = $db->exec($sql_3);
    if (!$succ) {
        throw new Exception('SQL 3 update failed');
    }

    $db->commit();

} catch (Exception $exp) {

    $db->rollBack();

}

 

深度模式

1、解释器模式(Interpreter):

         定义语言的文法,并建立一个解释器解释该语言中的句子。每个用过字典的童鞋都懂滴。

         好处:可扩展性比较好,灵活性大。

         弊端:可能难以维护复杂的文法。

         应用场景:用于成对或者一对多的需求中。

 

2、访问者模式(Visitor):

        封装某些用于作用于某种数据结构中各元素的操作,可以在不改变数据结构的前提下定义作用于这些元素的新操作。如银行排号机。

        好处:将相关的事物集中到一个访问者对象中。

        弊端:增加新数据结构很困难。

        应用场景:排队,排号。

 

三、总结

        

        本篇介绍了行为型模式,行为模式涉及到算法和对象职责间的分配,行为类模式采用继承机制在类间分派行为,TemplateMethod和Interpreter是类行为模式。行为对象模式使用对象复合而不是继承,一些行为对象模式描述了一组相互对等的对象如何相互协作以完成其中任何一个对象都单独无法完成的任务,如Mediator在对象间引入一个mediator对象提供了松耦合所需的间接性;Chain of Responsibility提供了更松的耦合,它通过一条候选对象链隐式的向一个对象发松请求,可以运行时刻决定哪些候选者参与到链中;Observer定义并保持了对象间的依赖关系;其它的行为对象模式常将行为封装封装在一个对象中,并将请求指派给它,Strategy模式将算法封装在对象中,这样可以方面的改变和指定一个对象所使用的算法;Command模式将请求封装在对象中,这样它就可以作为参数来传递,已可以存储在历史列表中或以其它方式使用;State模式封装一个对象的状态,使得当这个对象的状态对象变化时,该对象可改变它的行为;Visitor模式封装分布于多个类之间的行为;而Iterator模式则抽象了访问和遍历一个集合中对象的方式。

 

优才网免费公开课链接: http://www.ucai.cn/course5/

 

0
0
分享到:
评论

相关推荐

    php设计模式全解.rar

    3. 行为型模式:包括策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、访问者模式(Visitor)、命令模式(Command)、备忘录模式(Memento)、状态模式...

    php设计模式

    2. PHP设计模式的类型:PHP中常用的设计模式可以分为三大类,分别是创建型模式、结构型模式和行为型模式。创建型模式主要涉及对象实例化的过程,如单例模式、工厂模式、建造者模式等;结构型模式涉及如何组合类和...

    php设计模式大全php设计模式大全

    3. 行为型模式: - 责任链模式:避免将请求的发送者和接收者耦合在一起,使得多个对象都有可能处理请求。 - 命令模式:将请求封装为一个对象,以便使用不同的请求、队列请求、或者记录请求日志。 - 解释器模式:...

    用PHP语言实现16个设计模式.zip

    14. 状态模式:允许对象在其内部状态改变时改变其行为。它将条件分支逻辑封装到独立的类中,使代码更易于理解和维护。 15. 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。它使得子类可以不...

    PHP设计模式源码

    本资源包含了《PHP设计模式》一书中的实际代码示例,这些例程涵盖了多种设计模式,包括创建型、结构型和行为型模式。通过这些源码,开发者可以更直观地学习如何在实际项目中应用这些模式。 1. **创建型模式**: - ...

    PHP设计模式

    《PHP设计模式》是一本探讨如何在PHP编程中应用设计模式的书籍。设计模式是软件工程领域中,解决常见问题的模板或策略。本书作者是美国的Aaron Saray,内容详尽地介绍了各种设计模式,旨在帮助PHP开发者构建出更加...

    Learning PHP设计模式

    设计模式通常分为三大类:创建型、结构型和行为型。在PHP中,以下是一些常见的设计模式及其应用: 1. **单例模式(Singleton)**:保证一个类只有一个实例,并提供一个全局访问点。在PHP中,单例模式常用于数据库...

    php设计模式代码

    本压缩包“php设计模式代码”包含了作者亲笔编写的一些常见PHP设计模式的实现,下面将对这些设计模式进行详细的阐述。 1. **单例模式**:这种模式确保一个类只有一个实例,并提供一个全局访问点。在PHP中,单例模式...

    PHP设计模式介绍——CHM

    PHP设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。 1. **创建型模式**: - 单例模式:确保一个类只有一个实例,并提供一个全局访问点。 - 工厂模式:提供一个接口来创建对象,但让子类决定实例化...

    php设计模式案例详解

    PHP设计模式是将这些模式应用到PHP编程中的具体实现,可以帮助开发者编写更灵活、可维护和高效的代码。以下是对标题和描述中提及的一些设计模式的详细说明: 1. **解释器设计模式**:它允许我们创建一个简单的语言...

    PHP 面向对象 设计模式详解

    本文将深入探讨PHP中的面向对象和设计模式。 首先,我们来理解PHP的面向对象编程。在PHP 5及以上版本中,面向对象编程得到了全面支持,包括类、对象、继承、封装、多态等概念。类是对象的蓝图,定义了对象的属性...

    PHP设计模式 ((美)Aaron Saray) 中文pdf扫描版

    《PHP设计模式》一书由美国作者Aaron Saray撰写,主要针对PHP开发者,详细阐述了在实际编程过程中如何运用设计模式提升代码质量和可维护性。设计模式是软件工程中的最佳实践,它们是解决常见问题的经验总结,使得...

    PHP高级程序设计 模式、框架与测试 中文高清PDF版

    例如,工厂模式、单例模式、观察者模式等,都是在PHP开发中经常用到的设计模式。通过理解这些模式,开发者可以写出更灵活、可扩展的代码,并且能够更好地与其他开发者协作。 再者,“框架”章节会介绍一些流行的PHP...

    php设计模式介绍,php设计模式介绍

    **PHP设计模式详解** 在软件开发中,设计模式是一种经过时间考验、被广泛接受的解决方案模板,用于解决常见的设计问题。对于PHP开发者来说,理解并掌握设计模式是提升代码质量和可维护性的关键步骤。设计模式并非...

    PHP设计模式.rar

    3. 行为型模式:这类模式关注对象之间的交互和职责分配,包括责任链(Chain of Responsibility)、命令(Command)、解释器(Interpreter)、迭代器(Iterator)、备忘录(Memento)、观察者(Observer)、状态...

    php设计模式-designpatterns-php.zip

    "php设计模式-designpatterns-php.zip"这个压缩包很可能包含了关于如何在PHP项目中应用设计模式的资料,特别是针对"designpatterns-php-master"这个文件名,我们可以推测这可能是一个关于PHP设计模式的开源项目或...

    Guide.to.PHP.Design.Patterns(PHP设计模式-中英双语)

    3. 行为型模式:如策略(Strategy)、模板方法(Template Method)、观察者(Observer)、责任链(Chain of Responsibility)、访问者(Visitor)、命令(Command)、迭代器(Iterator)、备忘录(Memento)、状态...

    PHP设计模式概论【概念、分类、原则等】

    PHP设计模式可以帮助开发者构建更灵活、可扩展和易于维护的代码。设计模式并不是一种新技术,而是软件设计经验的结晶,它基于面向对象编程原则,如开闭原则(Open-Closed Principle)、里氏替换原则(Liskov ...

    PhpPatterns:php设计模式

    php设计模式 运行测试./vendor/bin/phpunit 创建型模式实例 单例模式 :check_mark_button: 工厂模式 :check_mark_button: 抽象工厂模式 :check_mark_button: 简单工厂模式 :check_mark_button: 静态工厂模式 :check_...

Global site tag (gtag.js) - Google Analytics