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

    一、定义

      观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。

    #观察者模式利用“组合”将许多观察者组合进主题中。对象(观察者——主题)之间的这种关系不是通过继承产生的,而是在运行时利用组合的方式产生的。 ——多用组合,少用继承!

    二、应用场景

      一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码

    # 今天正好遇到了一个观察者模式的使用
    
    # 功能需要:我的项目代码中需要添加一个上传图片的功能,但是上传图片完成后需要做一件事。图片数据保存至数据库
    
    # 分析:如果我们将代码逻辑操作,图片路径写入了数据库,后期修改了表的格式,或者添加了其他的字段,我们都需要留意上传图片的这边的代码,这样是不利于代码的统一维护的。
    
    # 问题:能否将两者分离开, 上传完图片及自动触发 储存图片数据的代码,但储存图片数据又不写在上传图片的逻辑中?
    
    # 解决: 上传图片是library层的操作, 存储图片数据是model层的操作。将两者关联,在上传图片完成前调用方法添加存储图片数据model(观察者),
    # 图片上传完成后,触发存储图片数据model(观察者)的方法保存图片数据至数据类

    三、实现过程

      两个原则

    # 1、封闭开放原则
    对于功能实现,是封闭的,
    但对功能的内容是开放的
    
    对修改是封闭的
    对扩展时开放的
    
    
    
    # 2、多用组合,少用扩展
    类与类之间存在关联关系,可以相互借用对方的方法,而不是添加更多的逻辑代码
    
    类的扩展不易过多,层级过多容易发生混乱

      

      功能需要:图片上传完成,保存图片数据至数据

     1 <?php
     2 
     3 class upload
     4 {
     5     public function register($obj)
     6     {
     7         $this->_observers[] = $obj;
     8     }
     9 
    10     public function trigger($data= null)
    11     {
    12         if (!empty($this->_observers)) {
    13             foreach ($this->_observers as $obj) {
    14                 $obj->add_upload();
    15             }
    16         }
    17 
    18     }
    19     public function html5upload()
    20     {
    21         #.....
    22         $this->trigger();
    23     }
    24 }
    25 
    26 class picture_model
    27 {
    28     public function add_upload()
    29     {
    30         echo '图片存储成功';
    31     }
    32 }
    33 
    34 $upload = new upload();
    35 $upload->register(new picture_model());
    36 $upload->html5upload();
    上面代码的简单实现

    四、总结

      当某个事件(逻辑)完成,需要执行其他关联事件(逻辑)时,可使用此模式。

      

  • 相关阅读:
    Linux进程状态——top,ps中看到进程状态D,S,Z的含义
    openstack-neutron基本的网络类型以及分析
    openstack octavia的实现与分析(二)·原理,架构与基本流程
    网络虚拟化基础协议·Geneve
    openstack octavia的实现与分析(一)·openstack负载均衡的现状与发展以及lvs,Nginx,Haproxy三种负载均衡机制的基本架构和对比
    Linux下多网卡绑定bond及模式介绍
    Python调试器-pdb的使用
    DELL R720服务器安装Windows Server 2008 R2 操作系统图文详解
    JAVA WEB实现前端加密后台解密
    JAVA实现AES和MD5加密
  • 原文地址:https://www.cnblogs.com/xiaobaiskill/p/8819493.html
Copyright © 2011-2022 走看看