java观察者模式
首先,弄明白两组概念:观察者(Observer)与被观察者(subject)、发布者(publicsher)与订阅者(subscriber)。这是相似的两组概念,讲的时候,要对应于各自所在的组,不要弄混了。在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。(这和前端vue的思想相同)观察者模式说白了,其实就是发布订阅模式,发布者发布信息,订阅者获...
·
首先,弄明白两组概念: 观察者(Observer)与被观察者(subject)、发布者(publicsher)与订阅者(subscriber)。这是相似的两组概念,讲的时候,要对应于各自所在的组,不要弄混了。
在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。(这和前端vue的思想相同)
观察者模式说白了,其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。
思路
- 抽象出观察者接口
- 抽象出被观察者接口
- 观察者类实现观察者接口
- 被观察者类实现被观察者接口(被观察者持有观察者的一个队列)
具体实现
实现时,可以不一步到位,在遇到问题的时候,你也许就知道该怎么做了
package com.wanmei.meishu.ms;
import java.util.ArrayList;
import java.util.List;
//观察者接口
interface Observable{
//观察
void addSub(ISubject sub);
//取消观察
void removeSub(ISubject sub,String msg);
//读取消息
void watch(String msg);
//获取观察者名称
String getName();
}
//观察者实例
class Observer implements Observable {
private String name;
public Observer(String name) {
this.name = name;
}
@Override
public void addSub(ISubject sub){
sub.addObserver(this);
System.out.println("Observer:用户【"+this.name+"】 订阅了消息");
}
@Override
public void removeSub(ISubject sub,String msg){
sub.removeObserver(this);
System.out.println("Observer:用户【"+this.name+"】 取消了订阅消息," + (msg == null ? "" : ("并说:" + msg)));
}
@Override
public void watch(String msg) {
System.out.println("Observer:用户【"+this.name+"】读取到的订阅消息是:" + msg);
}
public String getName() {
return name;
}
}
//被观察者接口
interface ISubject{
//给观察者们发送消息
void sendMsg(String msg);
//添加一个观察者
void addObserver(Observable user);
//取消一个观察者
void removeObserver(Observable user);
}
//被观察者实现方式
class SubjectImpl implements ISubject{
//持有观察者队列
private List<Observable> observerList;
//添加一个观察者
public synchronized void addObserver(Observable user){
if(observerList == null){
observerList = new ArrayList<Observable>();
}
observerList.add(user);
String str = "";
for (Observable observable : observerList) {
str+= observable.getName()+"、";
}
System.out.println("ISubject:目前已有用户:" + str.substring(0, str.length()-1));
}
//取消一个观察者
public void removeObserver(Observable user){
observerList.remove(user);
if(!observerList.isEmpty()){
String str = "";
for (Observable observable : observerList) {
str+= observable.getName()+"、";
}
System.out.println("ISubject:目前剩余用户:" + str.substring(0, str.length()- 1));
}
}
@Override
public void sendMsg(String msg) {
if(!observerList.isEmpty()){
System.out.println("ISubject:发送消息:" + msg);
for (Observable observable : observerList) {
observable.watch(msg);
}
}
}
}
public class ObserverTest {
public static void main(String[] args) {
ISubject sub = new SubjectImpl();
//第一个观察者
Observable u1 = new Observer("吴文俊");
u1.addSub(sub);
Observable u2 = new Observer("吴华云");
u2.addSub(sub);
Observable u3 = new Observer("李爪哇");
u3.addSub(sub);
sub.sendMsg("PHP是世界上最好的语言!");
u3.removeSub(sub,"去死吧,PHP");
sub.sendMsg("PHP是世界上最好的语言!");
}
}
运行结果:
ISubject:目前已有用户:吴文俊
Observer:用户【吴文俊】 订阅了消息
ISubject:目前已有用户:吴文俊、吴华云
Observer:用户【吴华云】 订阅了消息
ISubject:目前已有用户:吴文俊、吴华云、李爪哇
Observer:用户【李爪哇】 订阅了消息
ISubject:发送消息:PHP是世界上最好的语言!
Observer:用户【吴文俊】读取到的订阅消息是:PHP是世界上最好的语言!
Observer:用户【吴华云】读取到的订阅消息是:PHP是世界上最好的语言!
Observer:用户【李爪哇】读取到的订阅消息是:PHP是世界上最好的语言!
ISubject:目前剩余用户:吴文俊、吴华云
Observer:用户【李爪哇】 取消了订阅消息并说:去死吧,PHP
ISubject:发送消息:PHP是世界上最好的语言!
Observer:用户【吴文俊】读取到的订阅消息是:PHP是世界上最好的语言!
Observer:用户【吴华云】读取到的订阅消息是:PHP是世界上最好的语言!
更多推荐
已为社区贡献4条内容
所有评论(0)