• 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

  • 相关阅读:
    数理统计与Matlab: 第4章 回归分析
    汽车各部位名称详解【图】
    线性代数:第四章 矩 阵1
    曲线救国的就业路线是否合理?
    TortoiseSVN 编辑日志信息报错
    Ironpython及其他托管语言中值类型最好使用构造函数赋值,否则无法赋值的问题
    线性代数:第五章 二次型
    Matlab基础
    技术基层管理者交流QQ群243460070
    MATLAB软件基础
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7122574.html
Copyright © 2020-2023  润新知