模式介绍
观察者模式定义了一些列对象之间的一对多关系。当一个对象改变状态,其他依赖者都会收到通知。观察者模式提供了一种对象设计,让主题和观察者之间松耦合。
应用场景
在生活中有很多观察者的模式应用,譬如我们用手机短信订阅移动公司的天气预报,我们和移动公司就是观察者和目标的关系,还有我们订阅微信公众号等等。
例子说明
下面写一个关于微信公众号订阅的demo来演示一下观察者模式。
uml图
观察者接口
/**
* 观察者接口
*/
public interface Observer {
/**
* 更新内容
* @param content
*/
public void update(String content);
}
观察者A
/**
* 观察者A
*/
public class A implements Observer{
@Override
public void update(String content) {
// TODO Auto-generated method stub
System.out.println("我是A,我接收到的信息:"+content);
}
}
观察者B
/**
* 观察者B
*/
public class B implements Observer{
@Override
public void update(String content) {
// TODO Auto-generated method stub
System.out.println("我是B,我接收到的信息:"+content);
}
}
平台接口
/**
* 平台接口
* @author S
*
*/
public interface Platform {
/**
* 注册观察者
* @param o
*/
public void register(Observer o);
/**
* 移除观察者
* @param o
*/
public void unregister(Observer o);
/**
* ֪ͨ通知观察者
* @param content
*/
public void notifyMessage(String content);
}
微信公众平台
/**
* 微信公众平台
* @author S
*
*/
public class WeChatPlatform implements Platform{
private List<Observer> list = new ArrayList<>();
@Override
public void register(Observer o) {
// TODO Auto-generated method stub
list.add(o);
}
@Override
public void unregister(Observer o) {
// TODO Auto-generated method stub
list.remove(o);
}
@Override
public void notifyMessage(String content) {
// TODO Auto-generated method stub
for(int i=0;i<list.size();i++){
list.get(i).update(content);
}
}
}
测试
/**
* 观察者模式
* @author S
*
*/
public class Main {
public static void main(String args[]){
WeChatPlatform platform = new WeChatPlatform();
A a = new A();
B b = new B();
//用户订阅平台,添加观察者
platform.register(a);
platform.register(b);
//发送消息给订阅者
platform.notifyMessage("上午天气很好");
//用户取消订阅平台,移除观察者
platform.unregister(a);
//发送消息给订阅者
platform.notifyMessage("下午要下雨");
}
}
打印结果
我是A,我接收到的信息:上午天气很好
我是B,我接收到的信息:上午天气很好
我是B,我接收到的信息:下午要下雨