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

    定义:

      单一职责原则又称为单一功能原则,即不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

    原理:

      如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者一直这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心就是解耦和增强内聚性。

    问题由来:

      T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。也就是说职责P1和P2被耦合在了一起。

     产生原因:

      没有任何的程序设计人员不清楚应该写出高内聚低耦合的程序,但是很多耦合常常发生在不经意之间,其原因就是:职责扩散,因为某种原因,某一职责被分化为颗粒度更细的多个职责了。

    解决办法: 

      遵守单一职责原则,将不同的职责封装到不同的类或模块中

    优点:

    可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;

    • 提高类的可读性,提高系统的可维护性;
    • 变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响
    <?php
    
    namespace DesignPatternsBehavioralObserver;
    
    /**
     * 观察者模式 : 被观察对象 (主体对象)
     *
     * 主体对象维护观察者列表并发送通知
     *
     */
    class User implements SplSubject
    {
        /**
         * user data
         *
         * @var array
         */
        protected $data = array();
    
        /**
         * observers
         *
         * @var SplObjectStorage
         */
        protected $observers;
        
        public function __construct()
        {
            $this->observers = new SplObjectStorage();
        }
    
        /**
         * 附加观察者
         *
         * @param SplObserver $observer
         *
         * @return void
         */
        public function attach(SplObserver $observer)
        {
            $this->observers->attach($observer);
        }
    
        /**
         * 取消观察者
         *
         * @param SplObserver $observer
         *
         * @return void
         */
        public function detach(SplObserver $observer)
        {
            $this->observers->detach($observer);
        }
    
        /**
         * 通知观察者方法
         *
         * @return void
         */
        public function notify()
        {
            /** @var SplObserver $observer */
            foreach ($this->observers as $observer) {
                $observer->update($this);
            }
        }
    
        /**
         *
         * @param string $name
         * @param mixed  $value
         *
         * @return void
         */
        public function __set($name, $value)
        {
            $this->data[$name] = $value;
    
            // 通知观察者用户被改变
            $this->notify();
        }
    }

    将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的

  • 相关阅读:
    [HDOJ3567]Eight II
    [HDOJ3622]Bomb Game
    HTML 5 音频
    下拉菜单
    固定导航及右侧固定广告
    隔行换色
    返回顶部
    HTML 5 视频
    TAB切换
    自我介绍
  • 原文地址:https://www.cnblogs.com/hanshuai0921/p/6823705.html
Copyright © 2011-2022 走看看