您的位置:首页 > 其它

读书笔记之观察者模式

2017-02-22 18:05 239 查看
观察者模式主要有以下三点特点:

一.主体对象管理者某些数据,当这些数据一旦发生改变就会通知观察者,如果观察者对象已经订阅主题就会得到实时的数据更新,而非观察者对象不会。

二.观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象收到改变时,他的所有依赖者都会通知并自动更新

三.主题是真正拥有数据的人,观察者是主题的依赖者,在变化数据时更新,这比很多对象同时控制同一份数据,可以得到更干净的oo设计

综上所述,我们可以总结观察者模式的组成:

#抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

#具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知,具体主题角色通常用一个子类实现。

#抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题的更新时通知自己

#具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调,通常用一个子类实现,具体观察者角色可以保存一个志向具体主题的引用。

(在此之前说一点小知识,也不知道理解的对不对,有利于观察者模式的理解

假设有一个抽象类animal,有两个具体的实现dog与cat。

针对实现编程: Dog dog = new Dog(); dog.bark(); 声明状态d为dog类型,会造成我们必须针对具体实现代码

针对接口编程: Animal a = new Dog(); a.bark(); 我们知道该对象是狗,但是我们现在利用animal进行多态的调用)

//抽象主题角色,被观察
public interface Subject{
public void addWatcher(Watcher watcher);
public void removeWatcher(Watcher watcher);
public void notifyWatcher(String str);
}
//具体主题角色
public ConcretedSubject implements Subject{
//记录存放观察者
private List<Watcher> list = new ArrayList<>();
@override
public void addWatcher(Watcher watcher)
{
list.add(watcher);//注册观测者
}

@Override
public void removeWatcher(Watcher watcher)
{
list.remove(watcher);//移除观测者
}

@Override
public void notifyWatchers(String str)
{
// 在这里,我们把状态告诉每一个观察者,因为观察者都实现了update,所以我们知道如何通知他们
for (int i=0;i<list.size();i++)
{
Watcher watcher = (Watcher)list.get(i);
watcher.update(str);
}
}
}
//抽象观察者角色
public interface Watcher{
public void update(String str);
}
//具体观察者角色
public ConcretedWatcher implements Watcher{
@override
public void update(String str){
System.out.println(str);
}

}

编写测试类
public class Test
{
public static void main(String[] args)
{
Watched girl = new ConcreteWatched();//实例化一个具体主题角色

Watcher watcher1 = new ConcreteWatcher();//实例化一个具体观察者角色
Watcher watcher2 = new ConcreteWatcher();
Watcher watcher3 = new ConcreteWatcher();

girl.addWatcher(watcher1);//存放观察者
girl.addWatcher(watcher2);
girl.addWatcher(watcher3);

girl.removeWatcher(watcher3);//同时也可以移除观察者3

girl.notifyWatchers("开心");//主题通过该方法调用观察者的update方法通知所有的观察者主题状态改变了
}

}


优点:观察者模式解除了主题和观察者的耦合,让耦合的双方都依赖于抽象而不是依赖于具体的实现,从而各自的变化都不会影响到另一方的变化

缺点:依赖关系并未完全解除,抽象主题依旧依赖抽象观察者

适用场景:当一个对象需要改变而需要改变其它对象时,却不知道有多少个对象待改变

本文参考了

http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html

感谢作者圣骑士Wind对知识的分享
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: