设计模式之观察者模式
来源:互联网 发布:国家开放大学 网络教育 编辑:程序博客网 时间: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);}
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("下课"); }}
运行结果:
阅读全文
0 0
- 设计模式之-观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- Matlab函数bwmorph、bwperim
- matlab连接摄像头读取视频部…
- Oracle 一个用户将表权限赋给另一个用户
- 【转】(DT系列二)device tree的书写规范
- 如何将本地文件上传github
- 设计模式之观察者模式
- 实现局部放大图片功能
- 剑指offer-二叉树搜索与双向链表
- 多校1——Add More Zero(大水题)
- idea 503
- 有用网站
- python剔除符合条件的元素,不如剔除0
- 设计模式之一:单例模式
- mybatis中foreach使用