Behavioral模式之Observer模式

时间:2023-12-13 09:45:32

1.意图

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

2.别名

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

3.动机

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

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

4.适用性

下面情况使用ObServer模式:

- 当一个抽象模型有两个方面,当中一个方面依赖于还有一个方面。将这二者封装在独立的对象中以使它们能够各自独立的改变和复用。

- 当对一个对象的改变须要同一时候改变其他对象,而不知道详细有多少对象有待改变。

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

5.结构

包含这个模式在内的接下来的四个模式,都是类和类之间的关系,不涉及到继承。学的时候应该 记得归纳。记得本文最開始的那个图。观察者模式非常好理解,相似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时。常常会看到RSS图标。就这的意思是,当你订阅了该文章,假设兴许有更新,会及时通知你。

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

对象之间是一种一对多的关系。

先来看看关系图:

Behavioral模式之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