博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之观察者模式
阅读量:4352 次
发布时间:2019-06-07

本文共 3631 字,大约阅读时间需要 12 分钟。

一、观察者模式概念

   观察者模式,顾名思义,就是观察一个对象的变化而做出变化,观察的对象称之为观察者,被观察的对象称之为主体。就比如我们在课堂上上课,当老师在看着我们的时候我们就认真听课,而当老师转过身去的时候,很多同学就会开始开小差。在这当中我们就是观察者,老师就是主体,当老师的行为发生改变时,我们的行为就会做相应的改变,这就是所谓的观察者模式。

二、代码示例             

interface Subject{    void addListener(Observer observer);    void removeListener(Observer observer);    void trunArround();    void faceStudents();}class Teacher implements Subject{         private List
observers = new ArrayList
(); public void addListener(Observer observer){ observers.add(observer); } public void removeListener(Observer observer){ observers.remove(observer); } public void trunArround(){ for (Observer observer : observers) { observer.downAction(); } } public void faceStudents(){ for (Observer observer : observers) { observer.upAction(); } }}abstract class Observer{ abstract void upAction(); abstract void downAction();}class Student extends Observer{ public Student(Subject subject) { subject.addListener(this); } @Override void upAction() { System.out.println("我在认真学习"); } @Override void downAction() { System.out.println("我在玩手机"); } }public static void main(String[] args) throws Exception{ Teacher teacher = new Teacher(); Student firstStudent = new Student(teacher); Student second = new Student(teacher); teacher.trunArround(); teacher.faceStudents();}

运行代码会输出下面的结果

这就是当老师的行动有所改变时,所有的学生都可以感知到,从而做出相应的反应。

   上面的实现模式是当老师行动有所改变时,会通知到相关的学生,我做了什么动作,你们快做出相应的反应。这是不合乎情理,不可能老师说我要转身了,你们要玩手机的快玩手机吧。所以在这种场景里,学生作为观察者,需要时刻关注老师的行为,学生主动去获取老师的状态,查看其状态是否已改变,从而做出相应的动作。所以观察者模式还有一种实现,就是观察者能够主动去获取主体的状态。下面是其的实现代码:

interface Subject{    void addListener(Observer observer);    void removeListener(Observer observer);    void trunArround();    void faceStudents();}class Teacher implements Subject{        private Integer status = 1;         private List
observers = new ArrayList
(); public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public void addListener(Observer observer){ observers.add(observer); } public void removeListener(Observer observer){ observers.remove(observer); } public void trunArround(){ System.out.println("老师转身"); this.status = 2; } public void faceStudents(){ System.out.println("老师面对学生"); this.status = 1; }}abstract class Observer{ abstract void upAction(); abstract void downAction();}class Student extends Observer{ public Student(Subject subject) { subject.addListener(this); } public void watchTeacher(Subject subject){ if(subject instanceof Teacher){ if(((Teacher) subject).getStatus() == 1){ this.upAction(); }else if(((Teacher) subject).getStatus() == 2){ this.downAction(); } } } @Override void upAction() { System.out.println("我在认真学习"); } @Override void downAction() { System.out.println("我在玩手机"); } }public static void main(String[] args) throws Exception{ Teacher teacher = new Teacher(); Student student = new Student(teacher); teacher.trunArround(); student.watchTeacher(teacher); teacher.faceStudents(); student.watchTeacher(teacher);}

 

转载于:https://www.cnblogs.com/huangweikun/p/6441468.html

你可能感兴趣的文章
EMC队列 发件人为空 From Address: <>
查看>>
多路复用IO模型 IO multiplexing
查看>>
升级WordPress
查看>>
蒙蒙的Git
查看>>
js方法遇到就记录
查看>>
iReport采用JDBC的方式连接Oracle
查看>>
MongoDB 数据库的可视化
查看>>
AOP中的相关概念
查看>>
监控系统信息模块psutil
查看>>
python tokenizer
查看>>
类的成员修饰符
查看>>
A - Race to 1 Again
查看>>
Android studio来开发移动App--SQA计划和系统测试规程
查看>>
模式学习(一)
查看>>
高精度计算(二)
查看>>
二位几何运算类
查看>>
ZOJ 3622 Magic Number 打表找规律
查看>>
World final 2017 题解
查看>>
【兼容性】IE不支持日期字符串转换为日期对象
查看>>
函数语言
查看>>