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("学生没看见老师,老师看见了");    }}

测试结果:

--------学生看见老师来了----------玩游戏的学生,老师来了,学生看见老师来了,并进行提醒,老师没看见 ^_^看电影的学生,老师来了,学生看见老师来了,并进行提醒,老师没看见 ^_^---------学生没看见老师来了-------玩游戏的学生,老师来了,学生没看见老师,老师看见了看电影的学生,老师来了,学生没看见老师,老师看见了

至此,一个简单的观察者模式实现。