zoukankan      html  css  js  c++  java
  • Behavioral模式之Observer模式

    1.意图

    定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,全部依赖于它的对象都得到通知并被自己主动更新。

    2.别名

    依赖(dependents),公布-订阅(Publish-Subscribe)

    3.动机

    将一个系统切割成一系列相互协作的类。有一个常见的副作用:须要维护相关对象间的一致性。

    我们不希望为了维持一致性而使得个类之间紧密耦合。因此这样减少了他们的可重用性。

    4.适用性

    下面情况使用ObServer模式:
    - 当一个抽象模型有两个方面,当中一个方面依赖于还有一个方面。将这二者封装在独立的对象中以使它们能够各自独立的改变和复用。
    - 当对一个对象的改变须要同一时候改变其他对象,而不知道详细有多少对象有待改变。


    - 当一个对象必须通知其他对象。而它又不能假定其他对象是谁。换言之。你不希望这些对象之间是紧密耦合的。

    5.结构

    包含这个模式在内的接下来的四个模式,都是类和类之间的关系,不涉及到继承。学的时候应该 记得归纳,记得本文最開始的那个图。

    观察者模式非常好理解,相似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,常常会看到RSS图标,就这的意思是。当你订阅了该文章。假设兴许有更新,会及时通知你。

    事实上。简单来讲就一句话:当一个对象变化时,其他依赖该对象的对象都会收到通知,而且随着变化!对象之间是一种一对多的关系。

    先来看看关系图:
    Observer模式
    我解释下这些类的作用:MySubject类就是我们的主对象。Observer1和Observer2是依赖于MySubject的对象。当MySubject变化时。Observer1和Observer2必定变化。

    AbstractSubject类中定义着须要监控的对象列表。能够对其进行改动:添加或删除被监控对象。且当MySubject变化时。负责通知在列表内存在的对象。

    我们看实现代码:

    6.代码演示样例

    实现代码:
    一个Observer接口:

    public interface Observer {
        public void update();
    }

    两个实现类::

    public class Observer1 implements Observer {
    
        @Override
        public void update() {
            System.out.println("observer1 has received!");
        }
    }
    
    public class Observer2 implements Observer {
    
        @Override
        public void update() {
            System.out.println("observer2 has received!");
        }
    
    }

    Subject接口及实现类::

    public interface Subject {
    
        /*添加观察者*/
        public void add(Observer observer);
    
        /*删除观察者*/
        public void del(Observer observer);
    
        /*通知全部的观察者*/
        public void notifyObservers();
    
        /*自身的操作*/
        public void operation();
    }
    
    public abstract class AbstractSubject implements Subject {
    
        private Vector<Observer> vector = new Vector<Observer>();
        @Override
        public void add(Observer observer) {
            vector.add(observer);
        }
    
        @Override
        public void del(Observer observer) {
            vector.remove(observer);
        }
    
        @Override
        public void notifyObservers() {
            Enumeration<Observer> enumo = vector.elements();
            while(enumo.hasMoreElements()){
                enumo.nextElement().update();
            }
        }
    }
    
    public class MySubject extends AbstractSubject {
    
        @Override
        public void operation() {
            System.out.println("update self!");
            notifyObservers();
        }
    
    }

    測试类:

    public class ObserverTest {
    
        public static void main(String[] args) {
            Subject sub = new MySubject();
            sub.add(new Observer1());
            sub.add(new Observer2());
    
            sub.operation();
        }
    
    }

    输出:
    update self!
    observer1 has received!
    observer2 has received!。

    7.相关模式

    引用:

    http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
    http://item.jd.com/10057319.html
    http://blog.csdn.net/zhangerqing/article/details/8239539

  • 相关阅读:
    [APM] OneAPM 云监控部署与试用体验
    Elastic Stack 安装
    xBIM 综合使用案例与 ASP.NET MVC 集成(一)
    JQuery DataTables Selected Row
    力导向图Demo
    WPF ViewModelLocator
    Syncfusion SfDataGrid 导出Excel
    HTML Table to Json
    .net core 2.0 虚拟目录下载 Android Apk 等文件
    在BootStrap的modal中使用Select2
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7122574.html
Copyright © 2011-2022 走看看