观察者模式
来源:互联网 发布:mac优酷缓存视频转换 编辑:程序博客网 时间:2024/04/20 17:24
- /*
- * 观察者模式
- * 适用于一vs多的状况,当一个对象改变时,需要通知其他多个对象,而另外的多个对象各自有各自的独特行为!
- * 观察者模式从uml中很容易看出特点!有点类似于网络中的组播方式:多个设备加入组播组(多个对象成为观察者),一个设备发
- * 消息时,组播组中所有设备都将接收到消息(一个对象发通知,其他收到通知),设备收到消息后,怎么显示是自己的事情(如msn,qq等各种显示方式一样)
- * (其他对象收到通知时,也各自有自己的处理方式,扔掉or显示or...之类处理)
- *
- * Observer定义成一个接口,里面有两个方法(update,exitsubject退出订阅),应该还需要增加一个加入订阅,当时忘记了(只在具体实现接口
- * 初始化时注册加入订阅)
- *
- * weatherDisplay1 与 weatherDisplay2是两个具体实现接口Observer的类
- * 初始化时先注册加入到subject中,然后实现update和exitsubject功能
- *
- * 而subject是一个接口,用于被Observer注册订阅(相当于1VS多中的“1”),其中方法有加入,通知,退出等
- * 而weatherData是实现subject的一个类,具体实现上面的方法。
- *
- * 测试程序中可以看到观察者模式是怎样工作的,先加入订阅组,在更新时更新所有组内成员信息,然后类成员自己实现自己处理方式(例子中只是简单显示)
- * 另外,observer可以退出订阅,这时发送的通知就不会通知到该observer
- *
- */
- package observer_p;
- public class Test_main {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO 自动生成方法存根
- weatherData main_s = new weatherData();
- Observer o1 = new weatherDisplay1(main_s);
- Observer o2 = new weatherDisplay2(main_s);
- main_s.measurementChange(12,13);
- System.out.println("----------------------------------");
- main_s.measurementChange(15,16);
- System.out.println("----------------------------------");
- o1.exitSubject(main_s);
- main_s.measurementChange(18,19);
- }
- }
- //Observer .java
- /**
- *
- */
- package observer_p;
- /**
- * @author Administrator
- *
- */
- public interface Observer {
- void update(float t,float h);
- void exitSubject(Subject s);
- }
- //weatherDisplay1 .java
- package observer_p;
- public class weatherDisplay1 implements Observer{
- private float temperature;
- private float humidity;
- private Subject main_s;
- public weatherDisplay1(Subject s){
- s.registerObserver(this);
- this.main_s = s;
- }
- public void update(float t,float h){
- temperature = t;
- humidity = h;
- display1();
- }
- public void exitSubject(Subject s){
- s.removeObserver(this);
- }
- public void display1(){
- System.out.println("I am Display1 temperature :" + temperature +
- " humidity :" + humidity);
- }
- }
- //weatherDisplay2 .java
- package observer_p;
- public class weatherDisplay2 implements Observer{
- private float temperature;
- private float humidity;
- private Subject main_s;
- public weatherDisplay2(Subject s){
- s.registerObserver(this);
- this.main_s = s;
- }
- public void update(float t,float h){
- temperature = t;
- humidity = h;
- display2();
- }
- public void exitSubject(Subject s){
- s.removeObserver(this);
- }
- public void display2(){
- System.out.println("I am Display2 temperature :" + temperature +
- " humidity :" + humidity);
- }
- }
- //Subject .java
- /**
- *
- */
- package observer_p;
- /**
- * @author Administrator
- *
- */
- public interface Subject {
- void registerObserver(Observer o);
- void removeObserver(Observer o);
- void notifyObserver();
- }
- //weatherData .java
- package observer_p;
- import java.util.*;
- public class weatherData implements Subject{
- private ArrayList observer_list;
- private float temperature;
- private float humidity;
- public float getTemperature(){
- return temperature;
- }
- public float getHumidity(){
- return humidity;
- }
- public weatherData(){
- observer_list = new ArrayList(); //注意初始化
- }
- public void registerObserver(Observer o){
- observer_list.add(o);
- }
- public void removeObserver(Observer o){
- for(int i = 0;i<observer_list.size();i++)
- {
- if(observer_list.get(i) == o)
- {
- observer_list.remove(i);
- }
- }
- }
- public void notifyObserver(){
- for(int i = 0;i<observer_list.size();i++)
- {
- Observer o_tmp = (Observer)observer_list.get(i);
- o_tmp.update(temperature,humidity);
- }
- }
- public void measurementChange(float t,float h){
- temperature = t;
- humidity = h;
- notifyObserver();
- }
- }
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 一个逆序相加的小程序
- 网站推广的20种办法
- Google工程师解释Googlebot抓取网页的原理
- 转载:2008年软件业四大亮点回顾
- AT89C51 与 AT89S51/52 的区别
- 观察者模式
- 常见错误
- 汽车门户站点选择逐浪CMS
- 网站优化技巧
- 在Linux上搭建JSP运行环境(Linux+Apache+PHP+JSP)
- 无论是本地或全球推广让正在寻找你的客户轻而易举地找到你!
- 大小端存储问题
- 百度搜索引擎优化(百度SEO)
- MAC地址攻略