观察者模式指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式。
中介者模式是N对N的双向关系。观察者模式是1对N的单向关系。
设计模式,一定要敲代码理解
发布者抽象(主题)
/**
* @author ggbond
* @date 2024年04月15日 10:04
*/
public interface Theme {
// 添加观察者(订阅者)
public void attach(Subscribe s);
// 删除观察者(订阅者)
public void detach(Subscribe s);
// 通知所有观察者(订阅者)
public void notifySubscriber();
}
发布者实现
/**
* @author ggbond
* @date 2024年04月15日 10:06
*/
public class Publisher implements Theme{
private List<Subscribe> list=new ArrayList<>();
@Override
public void attach(Subscribe s) {
list.add(s);
}
@Override
public void detach(Subscribe s) {
list.remove(s);
}
//通知所有订阅者
@Override
public void notifySubscriber() {
System.out.println("@全体人员,今晚有个party,地点在望子成龙小学");
for (Subscribe o : list) {
o.getinfo();
}
}
}
订阅者抽象
public interface Subscribe {
void getinfo();
}
订阅者实现
/**
* @author ggbond
* @date 2024年04月15日 10:11
*/
public class Subscriber implements Subscribe{
private String name;
public Subscriber(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public void getinfo() {
System.out.println(name+":收到最新信息");
}
}
测试与结果
/**
* @author ggbond
* @date 2024年04月15日 10:14
*/
public class Main {
public static void main(String[] args) {
//发布者
Publisher publisher=new Publisher();
//订阅者
Subscribe s1=new Subscriber("ggbond1");
Subscribe s2=new Subscriber("ggbond2");
Subscribe s3=new Subscriber("ggbond3");
//订阅者订阅主题
publisher.attach(s1);
publisher.attach(s2);
publisher.attach(s3);
//通知
publisher.notifySubscriber();
}
}
@全体人员,今晚有个party,地点在望子成龙小学
ggbond1:收到最新信息
ggbond2:收到最新信息
ggbond3:收到最新信息
总结
关系为1对N,对满足开闭原则。 无需修改发布者代码就能引入新的订阅者类
代码下载
代码下载