观察者模式
观察者模式定义了对象之间的一对多依赖,让多个观察者同时监听某个主题对象,当主体对象发生变化时,它的所有观察者都会收到响应的通知。
基于JDK对观察者模式提供的支持,下面举个观察者模式的例子。
创建被观察者
import java.util.Observable;
/**
* @author xzl6656
* @create 2023-03-20 14:24
* @description 某某微信公众号
*
*被观察者
**/
public class WeChatOfficialAccount extends Observable {
/**
* 公众号名称
*/
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public WeChatOfficialAccount(String name) {
this.name = name;
}
public void publishNews(News news) {
System.out.println(this.name+"发布了新闻:"+news.getTitle()+"->"+news.getContent());
//设置标识位 changed = true,表示被观察者发生了改变
setChanged();
//通知所有观察者,可以给观察者传递数据
notifyObservers(news);
}
}
新闻类
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @author xzl6656
* @create 2023-03-20 14:28
* @description 新闻类
**/
@Data
@AllArgsConstructor
public class News {
/**
*标题
*/
private String title;
/**
* 内容
*/
private String content;
}
观察者类
import java.util.Observable;
import java.util.Observer;
/**
* @author xzl6656
* @create 2023-03-20 14:34
* @description 粉丝类
* 观察者类
**/
public class Fan implements Observer {
/**
* 姓名
*/
private String name;
public Fan(String name) {
this.name = name;
}
/**
* 公众号如果有更新,粉丝的这个方法就会被调用
* @param o 公众号
* @param arg 发布的新闻
*/
@Override
public void update(Observable o, Object arg) {
WeChatOfficialAccount weChatOfficialAccount = (WeChatOfficialAccount) o;
News news = (News) arg;
System.out.println(weChatOfficialAccount.getName()+"更新了,"+this.name+"收到了更新内容:"+news.getTitle()+"->"+news.getContent());
}
}
测试一下
public class Application {
public static void main(String[] args) {
//创建公众号
WeChatOfficialAccount officialAccount = new WeChatOfficialAccount("天下奇异录");
//添加两个粉丝
officialAccount.addObserver(new Fan("小张"));
officialAccount.addObserver(new Fan("小徐"));
//公众号发布新闻
officialAccount.publishNews(new News("经济大萧条","程序员行业开始走下坡路,大家都卷起来了"));
}
}
打印效果:
WeChatOfficialAccount类是被观察者对象,被观察者对象需要继承JDK的Observable类,继承后,被观察者对象包含如下属性和方法:
这些方法都是线程安全方法(加了synchronized同步锁)。