Java设计模式-观察者模式
来源:互联网 发布:淘宝上买手办的 编辑:程序博客网 时间:2024/06/16 13:37
观察者模式中,一个被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。这通常通过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
角色
抽象被观察者角色:把所有对观察者对象的引用保存在一个集合中,每个被观察者角色都可以有任意数量的观察者。被观察者提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
具体被观察者角色:在被观察者内部状态改变时,给所有登记过的观察者发出通知。具体被观察者角色通常用一个子类实现。
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
适用场景
1) 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2) 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
3) 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
应用:通过一个简单的例子,描述学生给玩游戏和看电影的学生把风,如果看见老师来了,则通知玩游戏和看电影的学生老师来了,该学习了,老师没看见玩游戏和看电影的学生做小动作。如果没看见老师,则玩游戏和看电影的学生被老师看到。
下面是源码:
1 Observer 抽象的观察者
package com.whf.observer;/* * @author:辰 * @E-mail:15538323378@163.com * @2017年6月19日下午5:44:38 *//** * 抽象的观察者 * @author WU * */public interface Observer { /** * 更新接口状态 * @param state */ public void update(String state);}
2 Watched 抽象的被观察者
package com.whf.observer;/* * @author:辰 * @E-mail:15538323378@163.com * @2017年6月19日下午5:45:39 *//** * 抽象的 【被观察者】 * 声明的方法(添加、移除观察者,通知观察者) * @author WU * */public interface Watched { public void addWatcher(Observer observer); public void removeWatcher(Observer observer); public void notifyWatchers(); }
3 PlayGameStudent类
package com.whf.observer;/* * @author:辰 * @E-mail:15538323378@163.com * @2017年6月19日下午5:50:05 *//** * 具体的观察者 * 玩游戏的学生 * @author WU * */public class PlayGameStudent implements Observer { @Override public void update(String state) { // TODO Auto-generated method stub System.out.println("玩游戏的学生,老师来了,"+state); }}
4 WactchMoveStudent 类
package com.whf.observer;/* * @author:辰 * @E-mail:15538323378@163.com * @2017年6月19日下午5:50:05 *//** * 具体的观察者 * 看电影的学生 * @author WU * */public class WactchMoveStudent implements Observer { @Override public void update(String state) { // TODO Auto-generated method stub System.out.println("看电影的学生,老师来了,"+state); }}
5 Sutdent 类
package com.whf.observer;import java.util.ArrayList;/* * @author:辰 * @E-mail:15538323378@163.com * @2017年6月19日下午5:47:27 *//** * 具体的观察者 * @author WU * */public class Student implements Watched{ /** * 用来保存注册的观察者对象 */ private ArrayList<Observer> observe = new ArrayList<Observer>(); private String state; public Student(String state) { super(); this.state = state; } public void setState(String state) { this.state = state; this.notifyWatchers(); } /** * 注册观察者对象 * 观察者对象 */ @Override public void addWatcher(Observer observer) { // TODO Auto-generated method stub observe.add(observer); } /** * 删除观察者对象 * 观察者对象 */ @Override public void removeWatcher(Observer observer) { // TODO Auto-generated method stub observe.remove(observer); } /** * 通知所有注册的观察者对象 */ @Override public void notifyWatchers() { // TODO Auto-generated method stub for(Observer observer : observe){ observer.update(state); } }}
6 Teacher 类
package com.whf.observer;import java.util.ArrayList;import java.util.List;/* * @author:辰 * @E-mail:15538323378@163.com * @2017年6月19日下午6:52:45 *//** * 具体的被观察者 * @author WU * */public class Teacher implements Watched{ /** * 用来保存注册的观察者对象 */ private List<Observer> list = new ArrayList<Observer>(); /** * 状态 */ private String state; public Teacher(String state) { super(); this.state = state; } public void setState(String state) { this.state = state; this.notifyWatchers(); } /** * 注册观察者对象 * 观察者对象 */ @Override public void addWatcher(Observer observer) { // TODO Auto-generated method stub list.add(observer); } /** * 删除观察者对象 * 观察者对象 */ @Override public void removeWatcher(Observer observer) { // TODO Auto-generated method stub list.remove(observer); } /** * 通知所有注册的观察者对象 */ public void notifyWatchers() { // TODO Auto-generated method stub for(Observer observer : list){ observer.update(state); } }}
7 Client 类
package com.whf.observer;/* * @author:辰 * @E-mail:15538323378@163.com * @2017年6月19日下午7:33:58 *//** * 客户端测试类 * @author WU * */public class Client { public static void main(String[] args) { //被观察的学生 Student student = new Student(""); //被观察的老师 Teacher teacher = new Teacher(""); //玩游戏的学生 PlayGameStudent playGameStudent = new PlayGameStudent(); //看电影的学生 WactchMoveStudent wactchMoveStudent = new WactchMoveStudent(); // 注册观察者对象 student.addWatcher(playGameStudent); student.addWatcher(wactchMoveStudent); // 注册观察者对象 teacher.addWatcher(playGameStudent); teacher.addWatcher(wactchMoveStudent); //情况一 : 学生看见老师,状态发生变化 System.out.println("--------学生看见老师来了----------"); student.setState("学生看见老师来了,并进行提醒,老师没看见 ^_^"); System.out.println("\n"); //情况二 : 学生未老师,状态发生变化 System.out.println("---------学生没看见老师来了-------"); teacher.setState("学生没看见老师,老师看见了"); }}
测试结果:
--------学生看见老师来了----------玩游戏的学生,老师来了,学生看见老师来了,并进行提醒,老师没看见 ^_^看电影的学生,老师来了,学生看见老师来了,并进行提醒,老师没看见 ^_^---------学生没看见老师来了-------玩游戏的学生,老师来了,学生没看见老师,老师看见了看电影的学生,老师来了,学生没看见老师,老师看见了
至此,一个简单的观察者模式实现。
- java设计模式-----观察者
- JAVA 观察者设计模式
- java观察者设计模式
- java观察者设计模式
- java 观察者设计模式
- JAVA-观察者设计模式
- JAVA设计模式--观察者
- Java---观察者设计模式
- Java设计模式:观察者
- Java设计模式-观察者
- java观察者设计模式
- java设计模式-观察者模式
- java设计模式---观察者模式
- java设计模式---观察者模式
- java设计模式---观察者模式
- java设计模式-----观察者模式
- java 设计模式---->观察者模式
- java设计模式----观察者模式
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—J(数状数组)
- Recyclerview+checkbox 简单的购物车效果
- Jackson 中JsonFormat时间类型字段的使用
- ThinkPaid 电脑鼠标不听指挥
- 应用keepalived主从容灾
- Java设计模式-观察者模式
- 我的网络编程学习之路——套接字选项
- c++ builder 中的 XMLDocument 类详解(14)
- poj 1182 食物链(思维+并查集)
- HashMap底层实现
- 《软件工程(C编码实践篇)-孟宁》学习心得汇报
- poj3616 Milking Time
- spark任务已经执行结束,但还显示RUNNING状态
- 偏差-方差分解