观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察者知道情况,其实是由目标将情况发送到观察者的。
观察者模式多用于实现订阅功能的场景,例如微博的订阅,当我们订阅了某个人的微博账号,当这个人发布了新的消息,就会通知我们。
现在我们举一个类似的情况,并使用代码来实现,为大家提供一个比较明显的认识。
大家都用过交流平台工具,如微信、qq,那么肯定知道"特别关心"这个功能,当你将谁设置为特别关心的时候,那个人一但发表朋友圈,系统就会立刻通知你,你的特别关心好友发表了一遍文章。。。假设小新的爸爸妈妈将小新设为了特别关心,用观察者模式改如何实现呢?那么我们就来实现下吧。
1、//观察者
//观察者
public class PersonObserver implements Observer {
private String name;
public PersonObserver(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
Circle circle = (Circle)o;
Infomation args = (Infomation)arg;
System.out.println(name+"接收到一个"+args.getName()+"发表的一个"+circle.getName()+"的朋友圈--"+args.getContext());
}
}
2、被观察者信息
public class Infomation {
private String name;
private String context;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
}
3、被观察者
public class Circle extends Observable {
private String name;
public Circle(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void produceInfo(Circle circle,Infomation infomation){
System.out.println(infomation.getName()+"发表了一个关于"+circle.getName()+"的朋友圈---"+infomation.getContext());
setChanged();
notifyObservers(infomation);
}
}
4、测试代码
public class Test {
public static void main(String[] args) {
Circle circle = new Circle("新年");
PersonObserver persion = new PersonObserver("小新爸爸");
circle.addObserver(persion);
PersonObserver persion2 = new PersonObserver("小新妈妈");
circle.addObserver(persion2);
Infomation infomation = new Infomation();
infomation.setName("小新");
infomation.setContext("今天是个好日子");
circle.produceInfo(circle,infomation);
}
}
运行结果为:

原文:https://www.cnblogs.com/shenwen/p/12686128.html