Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically.(定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。)
通用类图如下:
图片来源于:设计模式之禅。
观察者模式,比如:邮箱或者其他网站的订阅功能,服务器推送消息后,订阅了的用户都能收到最新的消息。
我们用的微信公众号应该也类似,有推送了,关注了的用户会收到推送信息。
这是一种一对多的关系。上面所说的订阅或者关注其实是添加依赖关系。让其可以接受到推送或者更新。
这里举个小例子,比如,订阅了新闻和广告。如果用户订阅了,其会收到最新的广告和新闻。
概要类图如下:
代码如下:
Observer 接口代码:
package phlin.observerpattern;
public interface Observer {
/**
* 更新信息,推送信息
* @param context
*/
public void update(String context);
}
一号订阅用户,实现Observer 接口:
package phlin.observerpattern;
public class UserTwo implements Observer {
@Override
public void update(String context) {
// TODO Auto-generated method stub
System.out.println("我是订阅二号,订阅到:"+context);
}
}
二号订阅用户,实现Observer接口:
package phlin.observerpattern;
public class UserTwo implements Observer {
@Override
public void update(String context) {
// TODO Auto-generated method stub
System.out.println("我是订阅二号,订阅到:"+context);
}
}
被观察者接口:
package phlin.observerpattern;
public interface BeObserver {
public void sendNews();
public void sendADS();
}
观察者操作接口:
package phlin.observerpattern;
public interface Observable {
/**
* 增加观察者
* @param observer
*/
public void addObserver(Observer observer);
/**
* 注销观察者
* @param observer
*/
public void deleteObserver(Observer observer);
/**
* 消息推送
* @param context
*/
public void notifyOfObserver(String context);
}
具体被观察者代码,实现被观察者接口,实现观察者操作接口:
package phlin.observerpattern;
import java.util.ArrayList;
public class ConcreteBeObserver implements BeObserver ,Observable {
private ArrayList<Observer> observerList =new ArrayList<Observer>();
@Override
public void addObserver(Observer observer) {
// TODO Auto-generated method stub
this.observerList.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
// TODO Auto-generated method stub
this.observerList.remove(observer);
}
@Override
public void notifyOfObserver(String context) {
// TODO Auto-generated method stub
for(Observer observer:observerList)
{
observer.update(context);
}
}
@Override
public void sendNews() {
// TODO Auto-generated method stub
this.notifyOfObserver("这是最新新闻,关注国家大事!");
}
@Override
public void sendADS() {
// TODO Auto-generated method stub
this.notifyOfObserver("这是最新广告,欢迎购买***产品");
}
}
测试代码:
package phlin.observerpattern;
public class Test {
public static void main(String[] args) {
//具体被观察者
ConcreteBeObserver conBeObserver=new ConcreteBeObserver();
//观察者一号、二号:
Observer UserOne=new UserOne();
Observer Usertwo=new UserTwo();
//注册观察者
conBeObserver.addObserver(UserOne);
conBeObserver.addObserver(Usertwo);
//更新消息
conBeObserver.sendNews();
conBeObserver.sendADS();
}
}
测试结果:
我是订阅一号:订阅到:这是最新新闻,关注国家大事!
我是订阅二号,订阅到:这是最新新闻,关注国家大事!
我是订阅一号:订阅到:这是最新广告,欢迎购买***产品
我是订阅二号,订阅到:这是最新广告,欢迎购买***产品
设计模式之禅
HeadFirst
有所不足,多多指正,谢谢!
原文地址:http://blog.csdn.net/androidolblog/article/details/46313841