标签:
一.观察者模式简介
当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。
二.实际应用
聊天室,消息订阅
在这些应用场景下,订阅者和聊天客户端称之为观察者,需要同步到多个订阅者的数据封装到对象中,
称之为目标。
三.模式核心
观察者模式是一对多的通知,当一个对象发生变化时,他需要告诉每一个对象。
通知观察者的方式:
1)推:观察者只能被动接受消息
2)拉:观察者可以自行决定是否接收消息。
消息对象通过容器存放所有观察者,消息更新时通过遍历容器通知每一个观察者更新消息。
四.简单代码实现
package com.lz.observer; /* * 观察者接口 */ public interface IObserver { void update(Subject sub); }
package com.lz.observer; public class Observer implements IObserver{ private int thisValue; public int getThisValue() { return thisValue; } public void setThisValue(int thisValue) { this.thisValue = thisValue; } @Override public void update(Subject sub) { thisValue = ((ConcreteSubject)sub).getValue(); } }
package com.lz.observer; import java.util.ArrayList; import java.util.List; public class Subject { /* * 存放观察者的容器 */ protected List<IObserver> list = new ArrayList<IObserver>(); public void addIObserver(IObserver iobs) { list.add(iobs); } public void remove(IObserver iobs) { list.remove(iobs); } /* * 状态发生变化时会通知所有观察者 */ protected void notifyAllObserver() { for (IObserver iObserver : list) { iObserver.update(this); } } }
package com.lz.observer; public class ConcreteSubject extends Subject{ private int value; public int getValue() { return value; } public void setValue(int value) { this.value = value; notifyAllObserver(); } }
package com.lz.observer; public class Client { public static void main(String[] args) { ConcreteSubject sub = new ConcreteSubject(); /* * 观察者 */ Observer obs1 = new Observer(); Observer obs2 = new Observer(); Observer obs3 = new Observer(); sub.addIObserver(obs1); sub.addIObserver(obs2); sub.addIObserver(obs3); sub.setValue(100); System.out.println(obs1.getThisValue()); System.out.println(obs2.getThisValue()); System.out.println(obs3.getThisValue()); sub.setValue(200); System.out.println(obs1.getThisValue()); System.out.println(obs2.getThisValue()); System.out.println(obs3.getThisValue()); } }
标签:
原文地址:http://www.cnblogs.com/larobyo/p/5406196.html