观察者模式
观察者模式是行为型模式的一种
,它是 对象之间多对一
的一种设计方案,就是多个观察者
盯着一个主对象
,若主对象发生某种行为,就可以通知观察者做出相应反应。
假设需求:
现有一个校讯通系统,该系统内可以绑定多个电话号码,当校讯通更改通知消息的同时,自动短信通知多个电话号码。
UML类图:
角色分析:
Subject:抽象被观察者,具体实现者使用一个容器保存观察者,实现该接口具有添加、删除、通知观察者功能。
Observe:抽象观察者,实现该接口具有更新自身状态的功能。
具体代码:
Subject:
public interface Subject {
//添加观察者
void registerObserver(Observerr o);
//删除观察者
void remove(Observerr o);
//通知所有观察者
void notifyObservers();
}
SchoolChatSys:
public class SchoolChatSys implements Subject{
//装载观察者容器
private List<Observerr> observsers ;
//系统通知信息
private String msg;
public SchoolChatSys() {
this.observsers = new ArrayList<>();
}
//系统通知信息改变,通知所有观察者
public void setMsg(String msg) {
this.msg = msg;
dataChange();
}
private void dataChange() {
notifyObservers();
}
//注册
public void registerObserver(Observerr o) {
observsers.add(o);
}
//移除
public void remove(Observerr o) {
if(observsers.contains(o)){
observsers.remove(o);
}
}
//通知
public void notifyObservers() {
for(int i = 0; i<observsers.size(); i++){
Observerr observerr = observsers.get(i);
observerr.update(msg);
}
}
}
Observerr:
public interface Observerr {
//更新自身状态
void update(String msg);
}
Num:
public class Num implements Observerr{
//电话号码
private String num;
public Num(String num) {
this.num = num;
}
@Override
public void update(String msg) {
System.out.println("用户号码"+num+"已获取信息:"+msg);
}
}
Client(测试类):
public class Client {
public static void main(String[] args) {
//被观察者
SchoolChatSys school = new SchoolChatSys();
//观察者
Observerr numA = new Num("12345678");
Observerr numB = new Num("87654321");
Observerr numC = new Num("123123456");
//注册观察者
school.registerObserver(numA);
school.registerObserver(numB);
school.registerObserver(numC);
//通知观察者
school.setMsg("周六需要补课。");
}
}
测试结果
用户号码12345678已获取信息:周六需要补课
用户号码87654321已获取信息:周六需要补课
用户号码123123456已获取信息:周六需要补课
Process finished with exit code 0
总结
-
观察者模式设计后,会以集合的方式来管理用户(Observer),包括注册,移除 和通知。
-
我们增加观察者,只需要创建一个观察者类,不需要改动其他类,遵守了ocp原则。