zoukankan      html  css  js  c++  java
  • php 观察者模式

    从面向过程的角度来看,首先是观察者向主题注册,注册完之后,主题再通知观察者做出相应的操作,整个事情就完了。

    从面向对象的角度来看,主题提供注册和通知的接口,观察者提供自身操作的接口,(这些观察者拥有一个同一个接口)观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者,耦合度相当之低。

    可以这么来说,就是,观察者设计模式能够更便利创建和查看目标对象状态的对象,并且提供和核心对象非耦合的置顶功能性。

    我们可以看到,观察者设计模式非常常用,在一般复杂的WEB系统中,观察者模式可以帮你减轻代码设计的压力,降低代码耦合。

    县来看一个完整的场景应用:

    设计一个订单类
    订单创建完成后,会做各种动作,比如发送EMAIL,或者改变订单状态等等。
    原始的方法,是将这些操作都写在create函数里面
    但是随着订单创建类的越来越庞大,这样的操作已经无法满足需求和快速变动
    这个时候,观察者模式出现了。
    

    来看下代码实例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39

    observers[$type][] = $observer; } //运行观察者 public function obServer($type) { if (isset($this->observers[$type])) { foreach ($this->observers[$type] as $obser) { $a = new $obser; $a->update($this); //公用方法 } } } //下单购买流程 public function create() { echo '购买成功'; $this->obServer('buy'); // buy动作 } } class orderEmail { public static function update($order) { echo '发送购买成功一个邮件'; } } class orderStatus { public static function update($order) { echo '改变订单状态'; } } $ob = new order; $ob->addObServer('buy', 'orderEmail'); $ob->addObServer('buy', 'orderStatus'); $ob->create(); 运行结果: 购买成功发送购买成功一个邮件改变订单状态 再来看个大点的实例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 _observers[]=$observer; } public function notify(){ foreach ($this->_observers as $observer) { $observer->watch(); } } } // 观察者 class Cat implements Observer{ public function watch(){ echo "Cat watches TV
    "; } } class Dog implements Observer{ public function watch(){ echo "Dog watches TV
    "; } } class People implements Observer{ public function watch(){ echo "People watches TV
    "; } } // 应用实例 $action=new Action(); $action->register(new Cat()); $action->register(new People()); $action->register(new Dog()); $action->notify(); 运行结果: Cat watches TV -------------------------------------------------------------------------------- People watches TV -------------------------------------------------------------------------------- Dog watches TV -------------------------------------------------------------------------------- 我们可以看到,所谓模式,更多的是一种想法,完全没必要拘泥于代码细节。观察者模式更多体现了两个独立的类利用接口完成一件本应该很复杂的事情。不利用主题类的话,我们还需要不断循环创建实例,执行操作。而现在只需要创建实例就好,执行操作的事儿只需要调用一次通知的方法就好啦。
  • 相关阅读:
    ERROR 000732:Output Geodatabase:Dataset Database ConnectionsConnection to localhost.sdeSDE.Dataset does not exist or is not supported
    【转】通过 INotifyPropertyChanged 实现观察者模式
    Fatal NI connect error 6413的解决办法 http://www.itpub.net/thread-107518-1-1.html
    Oracle impdp的ignore及 fromuser / touser 功能
    进度条插件使用demo
    两个div并列居中显示——当display:inline-block;时,两个div无法对齐即一高一矮
    两个div并列居中显示——当display:inline;时,div的宽高不起作用即两个div重叠显示
    轮播插件unslider.min.js使用demo
    WEB网页如何让背景图片跟随可视窗口自适应大小
    火狐浏览器不支持location.reload()(以改变页面大小时重新刷新页面为例)
  • 原文地址:https://www.cnblogs.com/djwhome/p/12532813.html
Copyright © 2011-2022 走看看