观察者模式(Observer)
来源:互联网 发布:网页加载本地js脚本 编辑:程序博客网 时间:2024/05/17 10:41
一.观察者模式定义:
对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并自动更新
二.观察者模式的结构说明:
1.Subject:目标对象
a.一个目标可以被多个观察者观察
b.目标可以提供添加和删除观察者,方便维护观察者
c.当目标的状态发生改变时,目标负责通知所有注册的,有效的观察者
2.Observer:定义观察者的接口,提供目标通知对应的更新方法,这个更新进行相应的业务处理
三.观察者模式的示例代码:
//Subject类
public class Subject {private List<Observer> observers=new ArrayList<Observer>();//注册观察者public void addObserver(Observer observer){observers.add(observer);}//删除观察者public void removeObserver(Observer observer){observers.remove(observer);}//通知所有的观察者public void nodifyAllObserver(){for(Observer observer:observers){observer.update(this);}}}//Observer接口
public interface Observer {public void update(Subject subject);}
报社发布报纸,读者阅读报纸
//阅读者类
public class Reader implements Observer{//这个观察者是引入自己的观察者,不是引入jdk的观察者private String name=null;@Overridepublic void update(Subject subject) {//收到通知后,回调目标的信息System.out.println(name+"收到报纸了,阅读它,内容是:"+((NewsPapper)subject).getContent());}public String getName() {return name;}public void setName(String name) {this.name = name;}}//报纸类
public class NewsPapper extends Subject{private String content=null;public String getContent() {return content;}public void setContent(String content) {this.content = content;//内容修改后,通知所有的监听者 this.nodifyAllReaders();}}//客户端测试
public class Client {public static void main(String[] args) {//创建阅读者Reader reader1=new Reader();reader1.setName("张三");Reader reader2=new Reader();reader2.setName("李四");Reader reader3=new Reader();reader3.setName("王五");NewsPapper papper=new NewsPapper();//注册阅读者papper.addReaders(reader1);papper.addReaders(reader2);papper.addReaders(reader3);//要出报纸啦papper.setContent("本期内容是观察者模式实例演示");}}
五.简单模拟jdk实现的awt观察者模式:
import java.util.ArrayList;import java.util.List;//事件类 class ActionEvent { private long when;//事件发生的时间 private Object source;//事件源 public ActionEvent(long when, Object source) { super(); this.when = when; this.source = source; } public long getWhen() { return when; } public Object getSource() { return source; } public void setWhen(long when) { this.when = when; } public void setSource(Object source) { this.source = source; } } //定义监听按钮的接口 interface ActionListener { public void actionPeformed(ActionEvent e); } //实现2个监听者 class MyActionListener implements ActionListener { @Override public void actionPeformed(ActionEvent e) { System.out.println("button pressed!!!"); } } class MyActionListener2 implements ActionListener { @Override public void actionPeformed(ActionEvent e) { System.out.println("button pressed 2!!!"); } } //模拟按钮类 class Button { private List<ActionListener> actionListeners=new ArrayList<ActionListener>(); public void buttonPressed(){ for (ActionListener actionListener : actionListeners) { actionListener.actionPeformed(new ActionEvent(System.currentTimeMillis(),this)); } } //注册监听者 public void addActionListener(ActionListener l){ actionListeners.add(l); } } //测试 public class Test { public static void main(String[] args) { Button b=new Button(); MyActionListener mal=new MyActionListener(); MyActionListener2 mal2=new MyActionListener2(); //注册监听 b.addActionListener(mal); b.addActionListener(mal2); b.buttonPressed();//发生按钮事件 } }
当然,jdk也提供了观察者模式,方便时,可直接查看jdk实现的观察者模式,鉴于是学习观察者模式,还是自己尝试着理解一下,方便以后复习
本文参考了《研磨设计模式》一书,以及马士兵老师的视频,特此声明!
- Observer 模式 观察者模式
- Observer模式 观察者模式
- 观察者模式(OBSERVER)
- 观察者(Observer)模式
- 观察者模式(Observer Pattern)
- 观察者(Observer)模式
- Observer(观察者)模式
- 观察者(Observer)模式
- 观察者(Observer)模式
- 观察者模式-Observer
- 观察者(Observer)模式
- 观察者设计模式Observer
- 观察者模式(Observer Pattern)
- 观察者(Observer)模式
- 观察者模式(Observer Pattern)
- Observer 观察者模式
- 观察者模式(Observer Pattern)
- Observer观察者模式小结
- 虚拟机屏幕分辨率调整步骤
- Android permission 权限类及中英文说明
- arm嵌入式开发关于寻址、内存重映射和启动之间的关系(ARM学习1)
- 慢查询日志开启和查询工具
- 百度地图终于增加了MapLibrary。等了好久
- 观察者模式(Observer)
- Using mpiBLAST
- 惠普:PC部门卖给宏碁或联想不是理想的选择
- 函数的形参(非引用形参、指针形参、引用形参)
- Oracle 的 sqlldr 用法
- Installing mpiBLAST
- define c/c++
- 10 个救命的 PHP 代码片段
- 用JAVA动态代理实现AOP