观察者模式定义了对象之间的一对多依赖,让多个观察者对象同时监听一个主体对象,当主体对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新,属于行为型模式。观察者模式有时也叫做发布订阅模式。观察者模式主要用于在关联行为之间建立一套触发机制的场景。观察者模式在现实生活应用非常广泛,比如:微信朋友圈动态通知,邮件通知,广播通知。
下面以JDK中相关的API来演示:
朋友圈类(被观察者):
package observer;
import java.util.Observable;
/**
* JDK提供的一种观察者的实现方式,被观察者
* Created by Lenovo on 2019-7-20.
*/
public class WxFriends extends Observable {
private String name="微信朋友圈";
private static WxFriends wxFriends=null;
private WxFriends(){}
public static WxFriends getInstance(){
if(null==wxFriends){
wxFriends=new WxFriends();
}
return wxFriends;
}
public String getName(){
return name;
}
public void publishSomethings(Somethings somethings){
System.out.println(somethings.getUsername()+"在"+this.name+"发了一个动态");
setChanged();
notifyObservers(somethings);
}
}
朋友圈动态类:
package observer;
/**
* Created by Lenovo on 2019-7-20.
*/
public class Somethings {
private String username;
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
用户类(观察者)
package observer;
import java.util.Observable;
import java.util.Observer;
/**观察者
* Created by Lenovo on 2019-7-20.
*/
public class User implements Observer{
private String name;
public User(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
WxFriends wxFriends=(WxFriends) o;
Somethings somethings=(Somethings) arg;
System.out.println("===========================");
System.out.println(name+"用户,你好\n"+"您收到一个来自"+wxFriends.getName()+"动态,内容如下:"+somethings.getContent()
+"来自于--------"+somethings.getUsername());
}
}
测试类:
package observer;
/**
* Created by Lenovo on 2019-7-20.
*/
public class ObserverTest {
public static void main(String[] args){
WxFriends wxFriends=WxFriends.getInstance();
User user=new User("阿浩");
wxFriends.addObserver(user);
Somethings somethings=new Somethings();
somethings.setUsername("James");
somethings.setContent("万物皆对象");
wxFriends.publishSomethings(somethings);
}
}
结果:
观察者的优点:
1.观察者和被观察者之间建立了一个抽象的耦合。
2.观察者模式支持广播通信。
缺点:
1.观察者之间有过多的细节依赖,提高时间消耗以及程序的复杂度。
2.使用要得当,要避免循环调用。
注:另外有利用guava实现的微信朋友圈,代码见:https://gitee.com/zhujunhao19960225/guanchazhemoshiguava.git