观察者模式 就是订阅者订阅一个主题,主题发布消息,订阅者接收消息,并作出相应的改变
应用场景 :微信公众号
需要一个主题接口和主题实现类;订阅者接口和订阅者实现类
一 、主题接口
/**
* 版权信息: © 中金财金服
*/
package observer;
/*****************************************************************************
*创建时间 : 2018年5月17日
*实现功能 : 主题接口
*作者 : sxl
*版本 : v0.0.1
-----------------------------------------------------------------------------
*修改记录:
*日 期 版本 修改人 修改内容
*2018年5月17日 v0.0.1 sxl 创建
*****************************************************************************/
public interface Subject {
/**
* 功能 : 注册一个观察者
*/
public void registerObserver(Observer observer);
/**
* 功能 : 删除一个观察者
*/
public void removeObserver(Observer observer);
/**
* 功能 : 提醒所有观察者
*/
public void notifyAlls(String message);
}
二 、观察者接口
/**
* 版权信息: © 中金财金服
*/
package observer;
/*****************************************************************************
*创建时间 : 2018年5月17日
*实现功能 : 观察者接口
*作者 : sxl
*版本 : v0.0.1
-----------------------------------------------------------------------------
*修改记录:
*日 期 版本 修改人 修改内容
*2018年5月17日 v0.0.1 sxl 创建
*****************************************************************************/
public interface Observer {
/**
* 功能 :观察者接收消息
*/
public void receiveMessage(String message);
}
三 、主题实现类
/**
* 版权信息: © 中金财金服
*/
package observer;
import java.util.ArrayList;
import java.util.List;
/*****************************************************************************
*创建时间 : 2018年5月17日
*实现功能 : 鞋子公众号
*作者 : sxl
*版本 : v0.0.1
-----------------------------------------------------------------------------
*修改记录:
*日 期 版本 修改人 修改内容
*2018年5月17日 v0.0.1 sxl 创建
*****************************************************************************/
public class ShoesSubject implements Subject {
/**
* 功能 : 一个用来存储所有订阅此公众号的观察者的容器
*/
public List<Observer> list = new ArrayList<Observer>();
public String message;
public void registerObserver(Observer observer) {
list.add(observer);
}
public void removeObserver(Observer observer) {
if (list.indexOf(observer) >= 0) {
list.remove(list.indexOf(observer));
}
}
public void notifyAlls(String message) {
for (Observer vo : list) {
vo.receiveMessage(message);
}
}
/**
* 功能 : 发布新的消息,提醒所有观察者
*/
public void releaseNewMessage(String message) {
notifyAlls(message);
}
}
四 、观察者实现类
/**
* 版权信息: © 中金财金服
*/
package observer;
/*****************************************************************************
*创建时间 : 2018年5月17日
*实现功能 : 一个观察者
*作者 : sxl
*版本 : v0.0.1
-----------------------------------------------------------------------------
*修改记录:
*日 期 版本 修改人 修改内容
*2018年5月17日 v0.0.1 sxl 创建
*****************************************************************************/
public class LoveShoesMan implements Observer {
/**
* 功能 :接收订阅号的消息
*/
public void receiveMessage(String message) {
System.out.println("我是个爱鞋子的美男子 : " + message);
}
}
/**
* 版权信息: © 中金财金服
*/
package observer;
/*****************************************************************************
*创建时间 : 2018年5月17日
*实现功能 : 一个观察者
*作者 : sxl
*版本 : v0.0.1
-----------------------------------------------------------------------------
*修改记录:
*日 期 版本 修改人 修改内容
*2018年5月17日 v0.0.1 sxl 创建
*****************************************************************************/
public class LoveShoesWoman implements Observer {
/**
* 功能 :接收订阅号的消息
*/
public void receiveMessage(String message) {
System.out.println("我是个爱鞋子的少妇 : " + message);
}
}
五 、测试类
/**
* 版权信息: © 中金财金服
*/
package observer;
/*****************************************************************************
*创建时间 : 2018年5月17日
*实现功能 : 测试类
*作者 : sxl
*版本 : v0.0.1
-----------------------------------------------------------------------------
*修改记录:
*日 期 版本 修改人 修改内容
*2018年5月17日 v0.0.1 sxl 创建
*****************************************************************************/
public class ObserverDemo {
public static void main(String[] args) {
// 申明一个主题
ShoesSubject subject = new ShoesSubject();
// 注册两个订阅者
Observer man = new LoveShoesMan();
Observer woman = new LoveShoesWoman();
// 订阅者订阅这个公众号
subject.registerObserver(man);
subject.registerObserver(woman);
// 公众号发布新消息
subject.releaseNewMessage("新到一批篮球鞋!!!");
subject.releaseNewMessage("新到一批帆布鞋!!!");
// 删除一个订阅者
subject.removeObserver(woman);
subject.releaseNewMessage("新到一批耐克鞋!!!");
}
}
结果