标签:
public interface Subject {
//注冊观察者对象o
public void attach(Observer o);
//删除观察者对象o
public void detach(Observer o);
//通知观察者
public void notifyObserver();
}public interface Observer {
//接收到通知的操作
public void update();
}import java.util.LinkedList;
import java.util.List;
public class ConcreteSubject implements Subject {
//用于保存自己的注冊对象
private List<Observer> observerList = new LinkedList<Observer>(); //方便常常的插入和删除操作
/**
* 注冊一个观察者
*/
@Override
public void attach(Observer o) {
// TODO Auto-generated method stub
observerList.add(o);
}
/**
* 取消一个观察者
*/
@Override
public void detach(Observer o) {
// TODO Auto-generated method stub
observerList.remove(o);
}
/**
* 通知观察者
*/
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
for(Observer obs : observerList ) {
obs.update(); //逐个通知观察者
}
}
}
public class ConcreteObserver implements Observer {
/**
* 接到通知的逻辑
*/
@Override
public void update() {
// TODO Auto-generated method stub
}
}public interface PublicOffcial {
//注冊订阅消息的用户
public void attach(WechatUser user);
//取消订阅消息的用户
public void detach(WechatUser user);
//向用户发送订阅
public void notifyObserver(String news);
}public interface WechatUser {
public void readNews(String news);
}import java.util.LinkedList;
import java.util.List;
public class PublicOffcialXXNewPaper implements PublicOffcial {
//已订阅用户的列表
private List< WechatUser> list = new LinkedList<WechatUser>();
/**
* 当用户订阅时。增加列表
*/
@Override
public void attach(WechatUser user) {
if( ! list.contains(user))
list.add(user);
}
/**
* 用户取消订阅时,从列表清除
*/
@Override
public void detach(WechatUser user) {
if(list.contains(user))
list.remove(user);
}
/**
* 通知订阅者
*/
@Override
public void notifyObserver(String news) {
for(WechatUser user : list ) {
user.readNews(news);
}
}
/**
* 报社某天的公布新闻工作,包含发送给微信订阅者,可能还要更新站点
* @param news
*/
public void ReleaseNews(String news) {
//something to do e.g: update website..
System.out.println("报社公布今日新闻【" + news + "】");
notifyObserver(news);
}
}
public class NewsPaperFan implements WechatUser {
private String name;
public NewsPaperFan(String name) {
// TODO Auto-generated constructor stub
this.name = name;
}
@Override
public void readNews(String news) {
System.out.println("用户: " + name + "收到订阅的新闻【" + news + "】");
}
}public class Client {
public static void main(String[] args) {
PublicOffcialXXNewPaper newPaper = new PublicOffcialXXNewPaper();
WechatUser user1 = new NewsPaperFan("Tony");
WechatUser user2 = new NewsPaperFan("Jack");
WechatUser user3 = new NewsPaperFan("David");
newPaper.attach(user1);
newPaper.attach(user2);
newPaper.attach(user3);
newPaper.ReleaseNews("苹果即将推出IPhone6...");
}
}
报社公布今日新闻【苹果即将推出IPhone6...】 用户: Tony收到订阅的新闻【苹果即将推出IPhone6...】 用户: Jack收到订阅的新闻【苹果即将推出IPhone6...】 用户: David收到订阅的新闻【苹果即将推出IPhone6...】
被观察者仅仅能观察到观察者的接口层定义。而不知道自己通知的观察者的详细类型,它们之间属于不同的抽象层面,没有紧密的耦合,easy扩展。
对于这一点。假设通知的过程是相互独立的任务。那么能够使用多线程去完毕,使通知在子线程中完毕。
一个对象事实上既能够作为观察者也能够作为被观察者,这样消息像在广播链中传递。可是须要注意假设链的长度假设过程。就会变的复杂。难以控制。
在异步处理过程须要考虑线程安全和队列的问题。
标签:
原文地址:http://www.cnblogs.com/mengfanrong/p/5246520.html