Java设计模式之观察者(Observer)模式
2017-11-30 17:32
489 查看
一、举例
假如,大学里的教务处想发布一条通知,他有两种措施:1. 对每一位在校学生和在职教师推送。
2. 发布一条公告,让学生和教师自己查看。
对于第一种办法,肯定是不可取的。因为这样的开销很大,需要花费很多的精力去做这件事情,而且很容易出现纰漏。
那么第二种办法,我们就可以称之为 观察者模式。其中教务处是被观察者,而老师和学生是观察者,观察者需要随时关注被观察者的动态。
二、代码实现
首先,构造被观察者——教务处import java.util.ArrayList; import java.util.List; import java.util.Observable; import java.util.Observer; /** * 被观察者——教务处 */ public class Office extends Observable{ //消息列表 private List<String> messageList = null; //类唯一实例 private static Office instance; //无参构造方法 public Office() { } /** * 获取唯一实例 * @return 返回唯一实例 */ public static Office getInstance(){ if (instance == null){ instance = new Office(); instance.messageList = new ArrayList<>(); } return instance; } /** * 添加观察者 接口 * @param observer 观察者 */ public void addMessageObserver(Observer observer){ this.addObserver(observer); } public void addMessage(String message){ this.messageList.add(message); System.out.println("教务处发布新公告:" + message); //设置被观察者状态发生变化 this.setChanged(); //通知观察者们 并传递新消息 this.notifyObservers(message); } }
在Office.class中需要继承至Observable类,表明这是被观察者。
然后,需要构造一个消息列表,用来存放其发布的公告。
对于教务处这个实体,有且只有一个,因此需要构造一个唯一的静态实例。
其次,需要设置一个注册观察者的接口,动态的添加观察者。
最后,在自己发布消息的时候,调用setChanged方法,这个方法用于告知观察者当前被观察者发生了变化,
再通过notifyObservers告知被观察者,让他们发生相应的动作,并将消息传递给观察者。
构造观察者——Student和Teacher
import java.util.Observable; import java.util.Observer; public class Student implements Observer{ @Override public void update(Observable o, Object message) { String newMessage = (String) message; System.out.println("【学生】接收到新通知:" + newMessage); } }
import java.util.Observable; import java.util.Observer; public class Teacher implements Observer{ @Override public void update(Observable o, Object message) { String newMessage = (String) message; System.out.println("【老师】接收到新通知:" + newMessage); } }
观察者.class 需要实现Observer接口,实现其update(Observable,Object)方法,在方法里面完成相应的逻辑处理。
用main方法来进行模拟
public static void main(String[] args) { //实例化被观察者——教务处 Office officeObservable = Office.getInstance(); //实例化观察者——教师和学生 Student studentObserver = new Student(); Teacher teacherObserver = new Teacher(); //注册观察者 officeObservable.addMessageObserver(studentObserver); officeObservable.addMessageObserver(teacherObserver); //教务处发布消息 officeObservable.addMessage("2017-2018学年度,第一次选课开始"); }
运行结果
教务处发布新公告:2017-2018学年度,第一次选课开始 【老师】接收到新通知:2017-2018学年度,第一次选课开始 【学生】接收到新通知:2017-2018学年度,第一次选课开始
三、小结
Java设计模式中的观察者模式通过以上举例,可以很清楚的看到如何实现被观察者与观察者直接进行消息传递的。通过这种设计模式可以使某些事情变得容易,让代码更加容易维护和扩展。碰到问题,可以多举几个例子,通过例子帮助理解,这样会使问题变得简单。——武科大教师 王磊
相关文章推荐
- Java设计模式之Observer 观察者模式
- Java设计模式(五) Observer(观察者)模式及Tomcat引申
- Java设计模式之Observer(观察者)模式
- $Java设计模式之——观察者模式(Observer)
- Java常用类库——观察者设计模式(Observer接口、Observable类)
- 设计模式 - 观察者模式(Observer Pattern) Java内置 使用方法
- Java 设计模式-观察者模式(Observer)
- Java开发中的23种设计模式之十五:观察者模式(Observer)
- Java设计模式——Observer(观察者)模式
- java设计模式:观察者模式(Observer)
- Java设计模式之Observer-观察者模式
- Java设计模式六:观察者模式(Observer)
- Java设计模式之从[星际争霸的兵种升级]分析观察者(Observer)模式
- Java设计模式——Observer(观察者)模式
- java设计模式之观察者模式Observer
- Java设计模式-观察者模式(Observer)
- 设计模式---观察者模式(Observer Pattern with java)
- Java 设计模式之观察者模式(Observer pattern)
- 【行为型模式】观察者模式(Observer)之23种java设计模式
- Java设计模式—观察者模式(Observer pattern)