设计模式之观察者模式

来源:互联网 发布:国家开放大学 网络教育 编辑:程序博客网 时间:2024/04/28 12:45
 定义
       观察者模式(Observer Pattern):又被称为发布-订阅(Publish/Subscribe)模式,是行为模式的一种,定义一种一对多的依赖关系,多个观察者同时观察某个目标对象。当目标对象的状态发生变化时,所有依赖此目标对象的的观察者都得到通知,并自动更新状态,与目标对象的状态保持一致。
 角色:
  •  Subject(抽象目标)角色:Subject中可以有任意多个Observer,并提供注册和删除观察者的接口。Subject中维持一个状态属性,当状态发生变化时及时通知观察者。
  •  Observer(抽象观察者)角色: Subject发生改变时,采取行动,提供一个行动接口。
  •  ConcreteSubject(具体目标)角色:此角色将本身引用(包括角色状态)存入ConcreteObserver对象中,当它的状态发生变化时,给注册过的各个观察者发出通知。
  •  ConcreteObserver(具体观察者)角色 :实现Observer定义的接口,当Subject状态改变时,更新自身状态,保持状态与Subject一致
 举例实现:
下面举例实现观察者模式,我们以老师通知学生上下课为例,老师是被观察者,学生是观察者。当上课时间到,老师状态为‘上课’,并通知观察他的学生们来教室上课;当下课时间到时,老师状态为‘下课’,并通知观察他的学生们下课。

Subject:
package com.xtli.controller.javaDesignPatterns.observerPattern;import java.util.ArrayList;/* * Subject(抽象目标者)角色:Subject中可以有任意多个Observer,并提供注册和删除观察者的接口。 * Subject中维持一个状态属性,当状态发生变化时通知观察者。 * */public abstract class Teacher {    ArrayList<Student> studs = new ArrayList<Student>();    String status = "";     public void setStatus(String status) {          this.status = status;     }     public String getStatus() {          return this.status;     }    public void register(Student stud) {     this.studs.add(stud);    }    public void unRegister(Student stud) {        this.studs.remove(stud);    }    abstract void sendMessage(String status);}

ConcreteSubject:
package com.xtli.controller.javaDesignPatterns.observerPattern;/* * ConcreteSubject(具体目标)角色:设置ConcreteSubject状态,并将本身引用(包括角色状态)存入ConcreteObserver中,当它的状态发生变化时,向它的各个观察者发出通知。 */public class YuWenTeacher extends Teacher {    public void sendMessage(String status) {        this.setStatus(status);        System.out.println("YuWenTeacher:" + status);        for(int i = 0; i < studs.size(); i++) {            Student stu = (Student) studs.get(i);            //通知学生上课/下课            stu.actionByTeacher(this);        }    }}


Observer:
package com.xtli.controller.javaDesignPatterns.observerPattern;/* * Observer(抽象观察者)角色:根据Subject,采取行动,提供一个行动接口。 */public interface Student {     //根据Subject采取行动    void actionByTeacher(Teacher tc);}

ConcreteObserver:
package com.xtli.controller.javaDesignPatterns.observerPattern;/* * ConcreteObserver(具体观察者)角色 :实现Observer接口,根据Subject不同的状态,采取不同行动,保持状态与Subject一致 */public class ClassStudent implements Student {     String name = "";     public ClassStudent(String name) {          this.name = name;     }    public void actionByTeacher(Teacher tc) {     if("上课".equals(tc.getStatus())) {          System.out.println(name+": 上课啦,去教室");     }     if("下课".equals(tc.getStatus())) {          System.out.println(name+": 下课啦,去玩咯");     }    }}

测试:
package com.xtli.controller.javaDesignPatterns.observerPattern;/* * 测试观察者模式 */public class Test{    public static void main(String[] args) {     Student xiaoMing = new ClassStudent("小明");     Student xiaoHong = new ClassStudent("小红");     Student daNiu = new ClassStudent("大牛");        Teacher tc = new YuWenTeacher();        tc.register(xiaoMing);        tc.register(xiaoHong);        tc.register(daNiu);        tc.sendMessage("上课");        System.out.println("======上课中======");        tc.sendMessage("下课");    }}

运行结果:



原创粉丝点击