观察者模式指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式。
中介者模式是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<>();@Overridepublic void attach(Subscribe s) {list.add(s);}@Overridepublic void detach(Subscribe s) {list.remove(s);}//通知所有订阅者@Overridepublic 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;}@Overridepublic 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,对满足开闭原则。 无需修改发布者代码就能引入新的订阅者类
代码下载
代码下载