• 也谈观察者模式


      不是你写个class 就是面向对象,我基本是都是面向过程来书写class,只是like oo 非 is oo 。 所以写出来的不伦不类,自己也都懒得看别说重构,只能重写。设计模式是面向对象层级较高的部分,属于面向对象的OOD(面向对象设计)。如果对面向对象分析与设计精通,那么读起来会产生共鸣甚至共振。如果是了解面向对象,读起来像白开水,没感觉。因为层级没达到,无法参悟。就像参禅一样。设计模式是遵循面向对象五大原则前提下,高手们给出典型问题的解决办法。设计模式不是重点,重点是那几大原则。

      oh,say too long。最近在研究观察者模式,举一个简单的例子 :  猫大叫一生,所有的老鼠都跑了,主人惊醒了 这就是一个经典的 对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,发起者是猫,观察者是老鼠,主人以及其他的生物。  发起者猫又称主题。就是什么玩意都要有个主题的意思。 这个猫主题有几个接口就是 :  观察者的增加和删除,叫。 那么我们定义这个主题的接口可以这么写

    interface Subject {
        public function registerObserver(Observer $obs);
        public function removeObserver(Observer $obs);
        public function cry();
    }

    在定义观察者的接口

    interface Observer{
        public function update();
    }

    ok 两个接口定义好了!

    因为猫是主题,所以用cat来实现主题接口

    class Cat implements Subject 
    {
        private $_observers = array();
        
        public function registerObserver(Observer $obs) {
            $this->_observers[]= $obs;
        }
        
        public function removeObserver( Observer $obs){
            $index = array_search($obs, $this->_observers);
            if ($index === FALSE || ! array_key_exists($index, $this->_observers)) {
                return FALSE;
            }
            unset($this->_observers[$index]);
            return TRUE;
        }
        
        public function cry() {
        
            if (!is_array($this->_observers)) {
                return FALSE;
            }
            
            foreach ($this->_observers as $value) {
                $value->update();
            }
        }
    
    }

    好主题的实例化完成了

    观察者就很简单了

    class Mouse implements Observer
    {
        private $_name;
        function __construct($name, $subject) {
            $this->_name = $name;
            $subject->registerObserver($this);
        }
        
        public function update()
        {
             echo $this->_name ."拼命的跑\n<br>";    
        }
    }
    
    
    
    class Master implements Observer
    {
        private $_name;
        function __construct($name, $sbuject){
            $this->_name = $name;
            $sbuject->registerObserver($this);    
        }
        public function update()
        {
            echo $this->_name ."主任被惊醒!\n";
        
        }
    }

    实例化调用

    class Client {
    
        public static function main(){
            $cat = new Cat();
            $mouseBig   = new Mouse('大老鼠',$cat);
            $mouseSmall = new Mouse('小老鼠', $cat); 
            $master = new Master('美女', $cat);
            $cat->cry();
        }
        
    }
    
    Client::main();

    ok ,完了!以上自己练着玩,如有雷同,算我抄你

  • 相关阅读:
    服务器迁移总结
    使用OpenSSL生成证书
    mysql Event、存储过程、表命令
    负载均衡 > 常见问题
    SpringMVC记住密码功能
    spring mvc +cookie+拦截器功能 实现系统自动登陆
    android studio之argument for @notnull parameter 'name'
    jQuery ajax表单提交实现局部刷新
    Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法
    ajax表单提交全路径
  • 原文地址:https://www.cnblogs.com/liuzhang/p/2941653.html
Copyright © 2020-2023  润新知