文章目录
前言
观察者模式在实际应用中比较多的,比如消息订阅,当消息更新变更会自动通知所有的订阅者,比如天气变化,qq微信发送群公告消息等等,当群里发送群消息所有好友都可以接收到消息通知。
一、观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
二、观察者模式示例
模拟发送通知,当通知更新时,自动通过微信,qq,短信发送通知消息。类图如下:
1.定义通知subject
代码如下:
package behavior.ObserverPattern;
import java.util.ArrayList;
import java.util.List;
/**
* 定义一个通知对象
*/
public class Notice {
private List<NoticeObserver> observers
= new ArrayList<NoticeObserver>();
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
this.notifyAllObservers();
}
/**
* 添加观察者
* @param observer
*/
public void attach(NoticeObserver observer){
observers.add(observer);
}
/**
* 发送所有的通知
*/
public void notifyAllObservers(){
for (NoticeObserver observer : observers) {
observer.sendNotice(msg);
}
}
}
2.定义观察者
代码如下:
/**
* observer观察者
*/
public abstract class NoticeObserver {
protected Notice notice;
public abstract void sendNotice(String msg);
}
3 定义具体的观察者
微信观察者代码如下:
/**
* 微信通知
*/
public class WechatNoticeObserver extends NoticeObserver{
public WechatNoticeObserver(Notice notice) {
this.notice = notice;
this.notice.attach(this);
}
@Override
public void sendNotice(String msg) {
System.out.println("微信接收消息:"+msg);
}
}
qq观察者代码如下:
/**
* qq 通知
*/
public class QQNoticeObsever extends NoticeObserver {
public QQNoticeObsever(Notice notice) {
this.notice = notice;
this.notice.attach(this);
}
@Override
public void sendNotice(String msg) {
System.out.println("QQ更新通知消息:"+msg);
}
}
短信观察者代码如下:
/**
* 短信通知
*/
public class MsgNoticeObserver extends NoticeObserver{
public MsgNoticeObserver(Notice notice) {
this.notice = notice;
this.notice.attach(this);
}
@Override
public void sendNotice(String msg) {
System.out.println("短信接收消息:"+msg);
}
}
4 测试
public class ObserverPatternTest {
public static void main(String[] args) {
Notice notice = new Notice();
new QQNoticeObsever(notice);
new WechatNoticeObserver(notice);
new MsgNoticeObserver(notice);
System.out.println("发送消息通知");
notice.setMsg("全体成员中午十二点开会....");
System.out.println("更新消息通知");
notice.setMsg("由于某某原因,全体成员中午十二点的会议推迟到下午两点....");
}
}
QQ更新通知消息:全体成员中午十二点开会....
微信接收消息:全体成员中午十二点开会....
短信接收消息:全体成员中午十二点开会....
更新消息通知
QQ更新通知消息:由于某某原因,全体成员中午十二点的会议推迟到下午两点....
微信接收消息:由于某某原因,全体成员中午十二点的会议推迟到下午两点....
短信接收消息:由于某某原因,全体成员中午十二点的会议推迟到下午两点....
总结
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。何时使用:个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知',进行广播通知。如何解决:使用面向对象技术,可以将这种依赖关系弱化。关键在于在抽象类里有一个 ArrayList 存放观察者们。