一、概述
观察者模式(有时也被称为发布(publish)——订阅(subscribe)模式),此模式中通常分为观察者(Observer)、被观察者(Subject),实现被观察者状态发生改变时,观察者会监听到改变。实际上状态发生改变的信息是由被观察者发送给观察者的。
二、模拟结构
(1)观察者(Observer):提供一个更新(通知 notify)的方法,被观察者动态发生改变时,所有“观察他的对象都得到通知。
(2)被观察者(Subject):提供增加(addObserver)、删除(deleteObserver)和通知(notifyObservers)观察者信息的功能
三、测试代码
观察者:
package com.dolphin.adapter;
public interface Observer {
void notify(String message,String subName);
}
class WechatChen implements Observer {
private String userName = "陈XX";
@Override
public void notify(String message, String subName) {
System.out.println(userName+":接收到来自公众号<"+subName+">的消息:"+message);
}
}
class WechatZhao implements Observer {
private String userName = "赵XX";
@Override
public void notify(String message, String subName) {
System.out.println(userName+":接收到来自公众号<"+subName+">的消息:"+message);
}
}
class WechatQian implements Observer {
private String userName = "钱XX";
@Override
public void notify(String message, String subName) {
System.out.println(userName+":接收到来自公众号<"+subName+">的消息:"+message);
}
}
被观察者:
package com.dolphin.adapter;
import java.util.ArrayList;
import java.util.List;
/**
* 被观察者接口
* @author dxchen
* 提供通知,添加观察者,移除观察者方法
*
*/
public interface Subject {
//添加观察者
void addObserver(Observer observer);
//移除观察者
void deleteObserver(Observer observer);
//通知信息
void notifyObserves(String message);
}
class PublicTec implements Subject {
private String subName = "科技类公众号";
List<Observer> observerList = new ArrayList<>();
@Override
public void addObserver(Observer observer) {
observerList.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
observerList.remove(observer);
}
@Override
public void notifyObserves(String message) {
for(Observer o: observerList) {
o.notify(message, subName);
}
}
}
class PublicLit implements Subject {
private String subName = "文学类类公众号";
List<Observer> observerList = new ArrayList<>();
@Override
public void addObserver(Observer observer) {
observerList.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
observerList.remove(observer);
}
@Override
public void notifyObserves(String message) {
for(Observer o: observerList) {
o.notify(message, subName);
}
}
}
测试代码:
package com.dolphin.adapter;
public class Test {
public static void main(String[] args) {
//有两个公众号
Subject publicLit = new PublicLit();//文学类公众号
Subject publicTec = new PublicTec();//科技类公众号
//三个微信用户
Observer wechatChen = new WechatChen();//陈XX
Observer wechatZhao = new WechatZhao();//赵XX
Observer wechatQian = new WechatQian();//钱XX
//订阅公众号 赵和陈订阅文学类 钱订阅科技类
publicLit.addObserver(wechatZhao);
publicLit.addObserver(wechatChen);
publicTec.addObserver(wechatQian);
//公众号推送信息
publicLit.notifyObserves("最新诺贝尔获奖得主。。。。");
publicTec.notifyObserves("神州16号升空。。。");
}
}
测试结果:
赵XX:接收到来自公众号<文学类类公众号>的消息:最新诺贝尔获奖得主。。。。
陈XX:接收到来自公众号<文学类类公众号>的消息:最新诺贝尔获奖得主。。。。
钱XX:接收到来自公众号<科技类公众号>的消息:神州16号升空。。。