观察者模式
需求
一个博客的发布和订阅,一个用户可能被其他人关注,也能关注其他人。
抽象观察者
public interface IObserver {
// 当被观察者发布文章就会调用此方法
void update(String name, String msg);
}
抽象被观察者
public interface IObserverable {
// 被关注
void follow(IObserver user);
// 被取消关注
void unFollow(IObserver user);
// 通知观察者
void notifyObserver();
}
博客用户
博客的用户既可以是文章的发布者(观察者),也可以是文章的订阅者(被观察者)。
public class BlogUser implements IObserverable, IObserver {
private String msg; // 发布的文章
private String name; // 用户名
// 用来存储关注你的观察者,Collections.synchronizedList()保证线程安全
private List<IObserver> list = Collections.synchronizedList(new ArrayList<>());
public BlogUser(String name) {
this.name = name;
}
@Override
public void update(String name, String msg) {
System.out.println(this.name + ":一条消息:" + name + "发布了一篇文章," + msg);
}
@Override
public void follow(IObserver user) {
list.add(user);
}
@Override
public void unFollow(IObserver user) {
if (!list.isEmpty())
list.remove(user);
}
@Override
public void notifyObserver() {
// 通知所有观察者
list.forEach(user -> {
user.update(this.name, this.msg);
});
}
/**
* @Description: 发布文章
* @auther: liucong
* @date: 2020/8/14 13:59
* @return:
*/
public void pushEssay(String msg) {
System.out.println(this.name + "发布了一篇文章:" + msg);
this.msg = msg;
// 文章发布完成就通知观察者
notifyObserver();
}
}
测试类
/**
* @Description: 测试博客发布文章,订阅文章
* @auther: liucong
@date: 2020/8/14 13:40
* @return:
*/
@Test
public void test01() {
// 创建多个博客用户
BlogUser userCamila = new BlogUser("Camila");
BlogUser userJFla = new BlogUser("J.FLa");
BlogUser userLisa = new BlogUser("Lisa");
// 关注用户
userCamila.follow(userJFla);
userCamila.follow(userLisa);
userJFla.follow(userCamila);
userJFla.follow(userLisa);
// 发布文章
userCamila.pushEssay("Chinese是世界上最好的语言");
System.out.println("-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_");
userJFla.pushEssay("Java未来前景");
}
Camila发布了一篇文章:Chinese是世界上最好的语言
J.FLa:一条消息:Camila发布了一篇文章,Chinese是世界上最好的语言
Lisa:一条消息:Camila发布了一篇文章,Chinese是世界上最好的语言
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
J.FLa发布了一篇文章:Java未来前景
Camila:一条消息:J.FLa发布了一篇文章,Java未来前景
Lisa:一条消息:J.FLa发布了一篇文章,Java未来前景
知识点
-
观察者模式又称 发布 - 订阅模式
-
被观察者必须得通知观察者,观察者才能去订阅
-
被观察者和观察者的关系是 一对多