一天一个设计模式---观察者模式
来源:互联网 发布:重庆网络推广平台 编辑:程序博客网 时间:2024/05/17 09:11
介绍:当我们的程序中,一个对象的行为或状态依赖于另一个对象,我们就可以使用观察者模式。当然,我们也可以另起一个线程来不断监听这个对象的状态,不过这样是会增加程序的开销。
ps:JDK中awt和swing的监听事件相关源码中就用的是观察者模式
场景:晚自习的时候,班里的同学有的在写作业,有的在背书,有的在玩手机,聊天。而殊不知老师就在窗边观察着。
一、角色及作用
其实,观察者模式有两个核心角色:被观察者,观察者。被观察者当其状态改变,则会通知此对象上的观察者。观察者当依赖对象状态改变,被观察者就会通知观察者。
二、老师与学生
主题,用于管理监听的观察者,实现数据更新时对他们的通知
public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObserver();}
具体的被观察者—学生
public class Student implements Subject { private ArrayList<Observer> observers = new ArrayList<>(); private String state; @Override public void registerObserver(Observer o) { observers.add(o); } @Override public void removeObserver(Observer o) { int i = observers.indexOf(o); if (i >= 0) { observers.remove(i); } } // 通知观察者 @Override public void notifyObserver() { for (int i = 0; i < observers.size(); i++) { observers.get(i).update(state); } } public String getState() { return state; } public void setState(String state) { this.state = state; System.out.println("同学正在" + state); notifyObserver(); }}
观察者,当主题更新时,调用update来更新数据
public interface Observer { public void update(String data);}
具体的观察者—老师
public class Teacher implements Observer { private Subject subject; public void observStudent(Subject subject) { this.subject = subject; subject.registerObserver(this); } @Override public void update(String data) { switch (data) { case "写作业": System.out.println("老师继续观察"); break; case "读书": System.out.println("老师继续观察"); break; case "聊天": System.out.println("老师批评"); break; case "玩手机": System.out.println("老师没收手机"); break; } }}
监视实例
public static void main(String[] args) { Student stu = new Student(); Teacher teacher = new Teacher(); teacher.observStudent(stu); stu.setState("写作业"); stu.setState("聊天"); stu.setState("读书"); stu.setState("玩手机"); }
输出如下
同学正在写作业老师继续观察同学正在聊天老师批评同学正在读书老师继续观察同学正在玩手机老师没收手机
可以看到,老师根据同学的状态在不断进行操作。
更多模式: 一天一个设计模式—分类与六大原则
更多源码: https://github.com/oDevilo/Java-Base
0 0
- 一天一个设计模式(3):观察者模式
- 一天一个设计模式---观察者模式
- 一天一个设计模式之观察者模式
- 一口一个设计模式--观察者模式
- 每天一个设计模式之观察者模式
- 一天一个设计模式(1): 代理模式
- 一天一个设计模式(2): 外观模式
- 一天一个设计模式(4):适配器模式
- 一天一个设计模式---单例模式
- 一天一个设计模式---代理模式
- 一天一个设计模式---享元模式
- 一天一个设计模式---工厂方法模式
- 一天一个设计模式---抽象工厂模式
- 一天一个设计模式---装饰者模式
- 一天一个设计模式---适配器模式
- 一天一个设计模式---状态模式
- 一天一个设计模式---策略模式
- 一天一个设计模式---模板方法模式
- 占位
- 数组类模板
- Eclipse下,Maven+JRebel安装破解手记
- JZOJ4773. 凸包
- parse()和valueOf()toString()的区别?
- 一天一个设计模式---观察者模式
- 动态规划:从新手到专家
- LightOJ 1262 Diagonal Sum 最大流
- VS1003芯片详解
- 简单万年历
- us_os_Ⅱ 笔记
- android程序员养成记录----------第二篇
- 9月10日360笔试编程题
- 自定义控件:快速索引