观察者模式-java实现
2013-10-17 19:13
429 查看
文章来源:软件秘笈--设计模式那点事儿
观察者模式(Observer Pattern),又称为发布/订阅模式。
定义:对象间的一种一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于他的对象都得到通知并被自动更新。
主要角色:观察者和被观察者。
实现:如果观察者和被观察者之间的的互动关系通过类的直接调用,就会增加观察者和被观察者之间的耦合性。在具体的实现中,我们需要面向接口编程,让被观察者管理观察者对象类型的接口,然后调用接口方法更新观察者。
类图:
实例描述:高温预警系统获取温度。如果温度高于35度,则计算温度所属的预警级别发出对应的预警信息,并通知订阅该预警信息的各个机构,如:学校,公园,个人 等。如果不高于35度的不发出预警信息。
代码:
观察者模式(Observer Pattern),又称为发布/订阅模式。
定义:对象间的一种一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于他的对象都得到通知并被自动更新。
主要角色:观察者和被观察者。
实现:如果观察者和被观察者之间的的互动关系通过类的直接调用,就会增加观察者和被观察者之间的耦合性。在具体的实现中,我们需要面向接口编程,让被观察者管理观察者对象类型的接口,然后调用接口方法更新观察者。
类图:
实例描述:高温预警系统获取温度。如果温度高于35度,则计算温度所属的预警级别发出对应的预警信息,并通知订阅该预警信息的各个机构,如:学校,公园,个人 等。如果不高于35度的不发出预警信息。
代码:
//被观察者接口 package com.demo.Subject; import com.demo.Observer.IObserver; public interface ISubject { public boolean add(IObserver observer); public boolean remove(IObserver observer); public void notifyAllObserver(); public void setTemperature(float temperature); public String temperatureReport(); }
//被观察者实现 package com.demo.Subject; import java.util.Iterator; import java.util.Vector; import com.demo.Observer.IObserver; public class Subject implements ISubject{ private float temperature; private String waringlevel; private Vector<IObserver> vector; //初始化vector容器 public Subject(){ vector = new Vector<IObserver>(); } //增加观察者 @Override public boolean add(IObserver observer) { if(observer != null && !vector.contains(observer)){ return vector.add(observer); } return false; } //删除观察者 @Override public boolean remove(IObserver observer) { return vector.remove(observer); } //通知观察者 @Override public void notifyAllObserver() { System.out.println("气象部门发布高温"+this.waringlevel+"警报"); Iterator<IObserver> iterator = vector.iterator(); while(iterator.hasNext()){ (iterator.next()).update(this); } } //根据温度蛇之预警级别 @Override public void setTemperature(float temperature) { this.temperature = temperature; this.invoke(); } @Override public String temperatureReport() { return "温度"+this.temperature; } private void invoke(){ if(this.temperature >= 35){ if(this.temperature < 37){ this.waringlevel = "***"; } if(this.temperature < 40){ this.waringlevel = "橙色"; } if(this.temperature >= 40 ){ this.waringlevel = "红色"; } //通知所有观察者 this.notifyAllObserver(); } } }
//观察者接口 package com.demo.Observer; import com.demo.Subject.ISubject; //观察者接口响应被观察者的变化 public interface IObserver { public void update(ISubject subject); }
//个人观察者 package com.demo.Observer; import com.demo.Subject.ISubject; //个人观察者 public class Person implements IObserver { @Override public void update(ISubject subject) { System.out.println("个人收到高温预警:"+subject.temperatureReport()); } }
//公园 package com.demo.Observer; import com.demo.Subject.ISubject; public class Park implements IObserver{ public void update(ISubject subject) { System.out.println("公园收到高温预警:"+subject.temperatureReport()); } }
//学校 package com.demo.Observer; import com.demo.Subject.ISubject; public class School implements IObserver{ public void update(ISubject subject) { System.out.println("学校收到高温预警:"+subject.temperatureReport()); } }
//测试 package com.demo; import java.util.Random; import com.demo.Observer.Park; import com.demo.Observer.Person; import com.demo.Observer.School; import com.demo.Subject.ISubject; import com.demo.Subject.Subject; public class Client { public static void main (String [] args){ ISubject subject = new Subject(); subject.add(new Person()); subject.add(new School()); subject.add(new Park()); Random random = new Random(); for(int i = 0; i < 10; i++){ //设置随机温度 subject.setTemperature(random.nextInt(100)); } } }
相关文章推荐
- 如何使用 Java8 实现观察者模式?(上)
- java实现观察者模式
- Rx_java(2) 使用java中的类(Observable与Observer)实现观察者模式
- JAVA实现观察者模式
- 浅谈java中内置的观察者模式与动态代理的实现
- 观察者模式及Java实现例子
- 观察者模式的Java实现及应用
- 最简单的观察者模式纯JAVA实现
- 如何使用 Java8 实现观察者模式?(上)
- java实现观察者模式
- 《大话设计模式》java实现之观察者模式
- 设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 观察者模式(Observer) - Java实现
- Java8 观察者模式详解 jdk实现源码分析
- 观察者模式及java实现
- java 中的观察者模式实现之接口回调
- 设计模式之观察者模式(有源码简单实现及java函数简单实现)
- JAVA设计模式 之 观察者模式(JDK内置实现)
- 利用Java提供的Observer接口和Observable类实现观察者模式
- 多线程下的观察者模式--Java实现
- Java 实现观察者(Observer)模式