Java设计模式-观察者模式
2017-06-19 21:11
489 查看
观察者模式中,一个被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。这通常通过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
角色
抽象被观察者角色:把所有对观察者对象的引用保存在一个集合中,每个被观察者角色都可以有任意数量的观察者。被观察者提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
具体被观察者角色:在被观察者内部状态改变时,给所有登记过的观察者发出通知。具体被观察者角色通常用一个子类实现。
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
适用场景
1) 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2) 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
3) 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
应用:通过一个简单的例子,描述学生给玩游戏和看电影的学生把风,如果看见老师来了,则通知玩游戏和看电影的学生老师来了,该学习了,老师没看见玩游戏和看电影的学生做小动作。如果没看见老师,则玩游戏和看电影的学生被老师看到。
下面是源码:
1 Observer 抽象的观察者
2 Watched 抽象的被观察者
3 PlayGameStudent类
4 WactchMoveStudent 类
5 Sutdent 类
6 Teacher 类
7 Client 类
测试结果:
至此,一个简单的观察者模式实现。
角色
抽象被观察者角色:把所有对观察者对象的引用保存在一个集合中,每个被观察者角色都可以有任意数量的观察者。被观察者提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
具体被观察者角色:在被观察者内部状态改变时,给所有登记过的观察者发出通知。具体被观察者角色通常用一个子类实现。
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
适用场景
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 抽象的被观察者
pac 4000 kage 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常用类库续3(比较器Comparable、Comparator、观察者设计模式、正则表达式、定时调度)
- java设计模式:观察者模式(Observer)
- JAVA设计模式-观察者模式简单例子
- 使用观察者模式实现Java应用程序设计MVC模式
- Java设计模式_行为模式_观察者模式
- 设计模式---观察者模式(Observer Pattern with java)
- Java设计模式—观察者模式(Observer pattern)
- java 设计模式-观察者模式
- Java设计模式 -- 观察者模式(push方式)
- All About JAVA 关于设计模式中的“观察者模式”
- java设计模式_观察者模式
- Java设计模式-----Observer观察者模式
- Java设计模式之Observer 观察者模式
- Java设计模式 -- 观察者模式(pull方式)
- Java设计模式 Design Pattern:观察者模式 Observer Pattern
- Java设计模式 Design Pattern:观察者模式 Observer Pattern
- 【设计模式】observer观察者模式:模拟java.awt.Button事件监听。
- 设计模式---观察者模式(Observer Pattern with java)