Java实现观察者模式
观察者模式,简单来说就是一对多的依赖,并且把观察者和被观察者对象分开松耦合
当某个对象的状态发生更新时,所有依赖的观察者都会收到更新,而断掉依赖的则不在收到
代码实现:
主题:售楼处的某位员工向有兴趣的用户群发房源降价的消息
1、创建观察者接口Observer
public interface Observer {
//观察者接口
void update(String msg);
}
2、创建被观察者接口
public interface Subject {
//被观察者的接口:注册、取消注册、观察通知
void reg(Observer obs);
void unreg(Observer obs);
void sendMessage(String msg);
}
3、被观察者的实现类
public class Building implements Subject {
List<Observer> obses = new ArrayList<Observer>();
//注册
@Override
public void reg(Observer obs) {
obses.add(obs);
}
//取消注册 拉黑
@Override
public void unreg(Observer obs) {
if (!obses.isEmpty()&&obses.contains(obs)){
obses.remove(obs);
}
}
//发消息,群发
@Override
public void sendMessage(String msg) {
for (Observer obs : obses) {
obs.update("某个售楼处的小姐姐:"+msg);
}
}
}
4、观察者的实现类
public class Yourself implements Observer{
private String yourName;
public Yourself(String yourName) {
this.yourName = yourName;
}
@Override
public void update(String msg) {
System.out.println(yourName+"接到"+msg);
}
}
5、main方法
public class App {
public static void main(String[] args) {
//创建一个售楼处的小姐姐(生产者)
Subject sister = new Building();
//创建3个观察者(消费者)
Observer ys1 = new Yourself("张三");
Observer ys2 = new Yourself("李四");
Observer ys3 = new Yourself("王五");
//去售楼处加小姐姐的微信
sister.reg(ys1);
sister.reg(ys2);
sister.reg(ys3);
//某天李四通知小姐姐取消订阅,说我不看了别发我了
sister.unreg(ys2);
//楼盘价格降了,售楼处的小姐姐通过加的微信通知观察者
sister.sendMessage("楼房价格降低了");
}
}
6、输出
可以看到李四取消订阅后,已经收不到消息了
“楼房价格降低了”);
}
}
6、输出
可以看到李四取消订阅后,已经收不到消息了
[外链图片转存中...(img-aH8ede5k-1616731575003)]