标签:
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