`
swengineer
  • 浏览: 42295 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

观察者模式应用场景实例

阅读更多
<?php

/**

  * 观察者模式应用场景实例

 *

 * 免责声明:本文只是以哈票网举例,示例中并未涉及哈票网任何业务代码,全部原创,如有雷同,纯属巧合。

  *

  * 场景描述:

  * 哈票以购票为核心业务 ( 此模式不限于该业务 ) ,但围绕购票会产生不同的其他逻辑,如:

  * 1 、购票后记录文本日志

  * 2 、购票后记录数据库日志

  * 3 、购票后发送短信

  * 4 、购票送抵扣卷、兑换卷、积分

  * 5 、其他各类活动等

  *

  * 传统解决方案 :

  * 在购票逻辑等类内部增加相关代码,完成各种逻辑。

  *

  * 存在问题:

  * 1 、一旦某个业务逻辑发生改变,如购票业务中增加其他业务逻辑,需要修改购票核心文件、甚至购票流程。

  * 2 、日积月累后,文件冗长,导致后续维护困难。

  *

  * 存在问题原因主要是程序的 " 紧密耦合 " ,使用观察模式将目前的业务逻辑优化成 " 松耦合 " ,达到易维护、易修改的目的,

  * 同时也符合面向接口编程的思想。

  *

  * 观察者模式典型实现方式:

  * 1 、定义 2 个接口:观察者(通知)接口、被观察者(主题)接口

  * 2 、定义 2 个类,观察者对象实现观察者接口、主题类实现被观者接口

  * 3 、主题类注册自己需要通知的观察者

  * 4 、主题类某个业务逻辑发生时通知观察者对象,每个观察者执行自己的业务逻辑。

  *

  * 示例:如以下代码

  *

  */

#=================== 定义观察者、被观察者接口 ============

/**

  *

  * 观察者接口 ( 通知接口 )

  *

  */

interface ITicketObserver // 观察者接口

{

    function onBuyTicketOver($sender, $args); // 得到通知后调用的方法

}

 

/**

  *

  * 主题接口

  *

  */

interface ITicketObservable // 被观察对象接口

{

    function addObserver($observer); // 提供注册观察者方法

}

#==================== 主题类实现 ========================

/**

  *

  * 主题类(购票)

  *

  */

class HipiaoBuy implements ITicketObservable { // 实现主题接口(被观察者)

    private $_observers = array (); // 通知数组(观察者)

   

 

    public function buyTicket($ticket) // 购票核心类,处理购票流程

{

       // TODO 购票逻辑

      

 

       // 循环通知,调用其 onBuyTicketOver 实现不同业务逻辑

       foreach ( $this-> _observers as $obs )

           $obs->onBuyTicketOver ( $this, $ticket ); //$this 可用来获取主题类句柄,在通知中使用

    }

   

    // 添加通知

    public function addObserver($observer) // 添加 N 个通知

{

       $this-> _observers [] = $observer;

    }

}

 

#========================= 定义多个通知 ====================

// 短信日志通知

class HipiaoMSM implements ITicketObserver {

    public function onBuyTicketOver($sender, $ticket) {

       echo (date ( 'Y-m-d H:i:s' ) . " 短信日志记录:购票成功 : $ticket <br>" );

    }

}

// 文本日志通知

class HipiaoTxt implements ITicketObserver {

    public function onBuyTicketOver($sender, $ticket) {

       echo (date ( 'Y-m-d H:i:s' ) . " 文本日志记录:购票成功 : $ticket <br>" );

    }

}

// 抵扣卷赠送通知

class HipiaoDiKou implements ITicketObserver {

    public function onBuyTicketOver($sender, $ticket) {

       echo (date ( 'Y-m-d H:i:s' ) . " 赠送抵扣卷:购票成功 : $ticket 赠送 10 元抵扣卷 1 张。 <br>" );

    }

}

#============================ 用户购票 ====================

$buy = new HipiaoBuy ();

$buy->addObserver ( new HipiaoMSM () ); // 根据不同业务逻辑加入各种通知

$buy->addObserver ( new HipiaoTxt () );

$buy->addObserver ( new HipiaoDiKou () );

// 购票

$buy->buyTicket ( " 一排一号 " );

?> 

 

 

CSDN本人原创.搬家至ITEYE.版权所有@Robot_G

分享到:
评论

相关推荐

    php观察者模式应用场景实例详解

    * 观察者模式应用场景实例 * * 免责声明:本文只是以哈票网举例,示例中并未涉及哈票网任何业务代码,全部原创,如有雷同,纯属巧合。 * * 场景描述: * 哈票以购票为核心业务(此模式不限于该业务),但围绕购票...

    java 设计模式 观察者模式 简单实例 包括测试test类

    下面将详细解释观察者模式的概念、结构以及如何在Java中应用这个模式。 **观察者模式的核心概念:** 1. **主题(Subject)**:它是被观察的对象,可以是任何具有状态变化的实体。主题维护着一个观察者列表,并负责...

    C#设计模式—观察者模式应用实例

    6. ObserverSample.csproj:这是项目文件,包含了整个观察者模式应用的编译和构建信息。 在C#中,观察者模式通常通过以下步骤实现: 1. 定义主题(Subject):主题是被观察的对象,它维护了一个观察者列表,并提供...

    观察者模式实例代码

    观察者模式的应用场景非常广泛,例如在GUI编程中,当用户界面组件的状态改变时,其他组件可能需要根据新状态进行相应的更新。在软件工程中,这种模式也常用于模块间的通信,使得系统更加松耦合。

    Android 设计模式学习之观察者模式应用实例

    在Android系统中,观察者模式广泛应用于事件处理、数据绑定等场景,如BroadcastReceiver和LiveData的实现。 **观察者模式的核心概念** 1. **主题(Subject)**:被观察的对象,它维护了一个观察者列表,并提供添加...

    观察者模式的一个应用

    #### 三、观察者模式的应用场景 观察者模式广泛应用于各种场景,如: - **事件处理系统**:例如GUI框架中的按钮点击事件等。 - **消息订阅系统**:用户订阅某个服务后,该服务状态变化时会通知订阅者。 - **数据...

    C# 观察者模式实例

    观察者模式是软件设计模式中的一种行为模式,它在面向对象编程中扮演着重要的角色...在ASP.NET开发中,观察者模式可以应用于用户界面的实时更新、数据库更改监听等多个场景,极大地提高了应用程序的响应性和用户体验。

    java观察者模式实例

    观察者模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在构建可扩展...在实际编程中,观察者模式广泛应用于事件驱动、用户界面更新、消息传递等场景,对于理解和创建松耦合的系统至关重要。

    设计模式--观察者模式java例子

    下面将详细介绍这两个关键组件以及如何使用它们来实现观察者模式。 1. `Observer`接口: - `Observer`接口提供了`update`方法,当被观察的对象状态发生变化时,该方法会被调用。通常,观察者会在这个方法中执行...

    设计模式-观察者

    5. **应用实例**:观察者模式广泛应用于各种场景,如事件驱动编程、GUI组件通信、消息队列等。例如,当用户在网页上点击按钮时,按钮作为被观察者,会触发一系列事件,这些事件的监听器(观察者)会接收到通知并执行...

    IOS 观察者模式实例Demo

    在这个“IOS 观察者模式实例Demo”中,我们将深入探讨如何在iOS应用中实现观察者模式,并通过实际的代码示例来理解其工作原理。 首先,观察者模式的主要角色有两个:主题(Subject)和观察者(Observer)。主题是被...

    观察者模式1Demo

    观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于事件处理、发布/订阅系统、以及...

    观察者模式模版和例子

    在提供的压缩包文件中,`观察者模式模版和例子`可能包含了实现这些概念的代码示例,通过阅读和理解这些代码,你可以更好地掌握观察者模式的实现细节和应用方式。为了深入学习,建议先了解观察者模式的基本概念,然后...

    观察者模式实现了股价涨跌提示

    在这个场景中,"股价涨跌提示"的功能就是一个典型的观察者模式应用实例。让我们深入探讨一下如何使用这种模式来实现这个功能。 在股市中,股民关注的股票价格时刻都在变动。当股票价格的涨跌幅达到特定阈值(例如5%...

    观察者模式简单例子

    观察者模式是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。在这个"观察者模式简单例子"中,我们将通过一个天气预报...

    设计模式之观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它...通过研究这些内容,可以更深入地理解和掌握观察者模式的原理和应用场景,从而在实际开发中灵活运用这一设计模式来提高代码的可维护性和可扩展性。

    C# 观察者模式实例介绍

    【观察者模式】是一种设计模式,它在软件开发中用于实现对象之间的通信和事件处理。在C#中,观察者模式允许一个对象(称为主题或被...通过这个简单的猫、老鼠和主人的例子,我们可以更好地理解观察者模式的原理和应用。

    Unity3D设计模式之观察者模式

    3. **使用观察者模式**:在游戏中实例化`PlayerHealthSubject`和`PlayerHealthUI`。 #### 观察者模式的优点 - **解耦**:观察者与被观察者之间的解耦使得两者可以独立发展,不受彼此的影响。 - **灵活性**:可以...

Global site tag (gtag.js) - Google Analytics