观察者模式,又叫发布-订阅模式,定义对象间一种一对多的依赖关系(注册),使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新(通知)。
例子:
公众号发送信息
被观察者接口 (抽象的公众号,具有添加用户,删除用户,设置发送信息,发送信息的功能) 。它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。
具体的被观察者(具体的公众号,实现被观察接口)
观察者接口(抽象的用户<可以不要接口,但不符合设计原则>,具有姓名属性,有接收消息的方法)
具体的观察者(具体的一个用户,实现观察者接口)
一个具体的公众号对应多个用户。当公众号发送消息时,只有关注该公众号的用户才能接受到信息
抽象公众号类:
package edu.etime.observer;
/**
* @Author zp
* @Date 2022/9/22 7:21 PM
* @Description: TODO
*/
/**
* 公众号接口-->抽象主题角色
*/
public interface OfficialAccount {
//关注
public void add(UserInterface user);
//取关
public void remove(UserInterface user);
//设置消息
public void setMsg(String msg);
//发送消息
public void sendMsg();
}
具体公众号类:
package edu.etime.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @Author zp
* @Date 2022/9/22 7:31 PM
* @Description: TODO
*/
public class AOfficialAccount implements OfficialAccount{
//声明一个集合来存放关注该公众号的用户
List<UserInterface> userList = new ArrayList<>();
private String msg;
@Override
public void add(UserInterface user) {
userList.add(user);
}
@Override
public void remove(UserInterface user) {
userList.remove(user);
}
@Override
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public void sendMsg() {
for (UserInterface user:userList){
user.getMsg(msg);
}
}
}
抽象用户接口
package edu.etime.observer;
/**
* @Author zp
* @Date 2022/9/22 7:23 PM
* @Description: TODO
*/
/**
* 观察者角色接口
*/
public interface UserInterface {
public void getMsg(String msg);
}
具体用户类:
package edu.etime.observer;
/**
* @Author zp
* @Date 2022/9/22 7:25 PM
* @Description: TODO
*/
/**
* 具体的观察者类
*/
public class User implements UserInterface{
private String name;
public String getName() {
return name;
}
public User(String name) {
this.name = name;
}
@Override
public void getMsg(String msg) {
System.out.println(name+"接收到了的公众号信息为:"+msg);
}
}
测试类:
package edu.etime.observer;
/**
* @Author zp
* @Date 2022/9/22 7:37 PM
* @Description: TODO
*/
public class Test {
public static void main(String[] args) {
//创建一个A公众号
OfficialAccount officialAccount = new AOfficialAccount();
//创建一些用户
UserInterface u1 = new User("zp");
UserInterface u2 = new User("zdj");
UserInterface u3 = new User("ljm");
UserInterface u4 = new User("qdh");
//用户123关注A公众号
officialAccount.add(u1);
officialAccount.add(u2);
officialAccount.add(u3);
//设置公众号要发送的信息
officialAccount.setMsg("好久不见");
//发送消息给关注公众号的所有用户
officialAccount.sendMsg();
//用户2取关
officialAccount.remove(u2);
//公众号再次发送信息
officialAccount.setMsg("我很想你");
officialAccount.sendMsg();
}
}