一.简单介绍
观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式),一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
二.原理结构图
Ob就是观察者的意思,Subject是被观察对象,我们把他们都定义一个抽象接口。
观察者(Observer)
将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。(这里的容器就是我们所说的集合,因为你一个被观察者可能有多个观察者在观察)
被观察
被观察对象发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者。
撤销观察
观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。
注册观察
就是将观察者添加到容器中。
三.现实生活的应用
对于观察者设计模式的应用,虽然是一个老生常谈的场景,但比较一二,还是觉得微博的关注-通知功能再适合不过;
玩过微博的都知道,我们在关注某一个大V或者明星之后,微博在消息通知里,总会给你推送他的相关更新,实在是十分烦人。在这里面,我们充当的角色就是观察者,一个任人宰割的角色,一个别人靠我们盈利的角色,一个别人把我们卖了,我们还替别人数钱的角色。。。(所以说戏子最无情,没事别看微博,关注关注我啊,明星大腕会让你伤心,可我不会啊!!!)
四.代码实现
Observer接口(观察者)
public interface Observer {
/**
* 收到信息
* @param s
*/
void update(String s);
}
Subject接口(被观察者)
public interface Subject {
void addFans(Observer observer);
void removeFans(Observer observer);
void nofify(String s);
}
VSubject类(观察者的实现类-微博大V)
public class VSubject implements Subject{
List<Observer> observers = new ArrayList<>();
@Override
public void addFans(Observer observers) {
this.observers.add(observers);
}
@Override
public void removeFans(Observer observers) {
this.observers.remove(observers);
}
@Override
public void nofify(String s) {
for (Observer observer : observers){
observer.update(s);
}
}
}
FanObserver(观察者的实现类-我们)
public class FanObserver implements Observer{
String name;
public FanObserver(String name){
this.name = name;
}
@Override
public void update(String s) {
System.out.println(name + "收到了消息"+s);
}
}
测试类
public class WeiboTest {
public static void main(String[] args){
FanObserver fanObserver1 = new FanObserver("张三");
FanObserver fanObserver2 = new FanObserver("李四");
FanObserver fanObserver3 = new FanObserver("王二");
FanObserver fanObserver4 = new FanObserver("赵武");
VSubject vSubject = new VSubject();
vSubject.addFans(fanObserver1);
vSubject.addFans(fanObserver2);
vSubject.addFans(fanObserver3);
vSubject.addFans(fanObserver4);
vSubject.nofify("厉害了");
vSubject.removeFans(fanObserver1);
vSubject.nofify("踢走一个人");
}
}
五.实际开发中的优缺点分析
综上所述,Java编程中需要大量应用观察者模式的模型。观察者模式作为一种十分常用的设计模式,为我们的编写程序提供了便利。最后想总结一下观察者模式的优缺点。
优点:观察者与被观察者之间是一个轻度的关联关系,体现了模块的高内聚,低耦合。因此对于观察者和被观察者来说,要进行扩展就比较简单了。被观察者并不需要认识任何一个具体的观察者。它只需要提供一个观察者共同的接口即可。提高代码的可复用性。
缺点:在状态变化,观察者通知被观察者的时候,如果观察者过多,那么可能导致消息的传送失去实时性。