【设计模式】观察者模式Observe(Java)
文章目录
- 1. 观察者模式定义
- 2. 类图
- 3.Java实现
- 3.1 定义主题Interface
- 3.2 定义观察者Interface
- 3.3 定义具体主题
- 3.4 定义具体观察者
- 3.5 定义测试主方法
1. 观察者模式定义
观察者模式定义了对象之间的一对多依赖,这样以来,当一个对象改变状态时,他的所有观察者都会收到通知并且自动更新。
2. 类图
- 主题接口,对象使用主题接口注册为观察者
- 具体主题必须实现主题接口,除了注册和删除方法外,具体主题还实现了notifyObservers()方法,此方法用于在状态改变时更新所有当前观察者。具体主题也可以有设置和获取状态的方法
- 每个主题可以有许多观察者
- 所有潜在的观察者必须实现观察者接口,这个接口只有update()方法,当主题状态被改变时它会被调用
- 具体观察者可以是实现此接口的任意类。观察者必须注册具体主题,以便接收更新
3.Java实现
3.1 定义主题Interface
package Observer;/*** 主题接口:点击*/
public interface Clickable {//单击(通知所有观察者)void click();//添加单击事件的观察者void addClickableObserver(ClickableObserver observer);//移除单击事件的观察者void removeClickableObserver(ClickableObserver observer);}
3.2 定义观察者Interface
package Observer;/*** 观察者接口*/
public interface ClickableObserver {//接口//发生单击事件时的操作void clicked(Clickable clickable);
}
3.3 定义具体主题
package Observer;import java.util.ArrayList;
import java.util.List;/*** 具体主题,实现主题接口*/
public class Button implements Clickable{//存储注册过的单击事件观察者 List<ClickableObserver> observers=new ArrayList<ClickableObserver>();//按钮信息String color;//颜色int x,y;//坐标@Overridepublic void click() {System.out.println("按钮被点击,通知所有观察者");//执行所有观察者的事件处理方法for(int i=observers.size()-1;i>=0;i--){observers.get(i).clicked(this);}}@Overridepublic void addClickableObserver(ClickableObserver observer) {observers.add(observer);}@Overridepublic void removeClickableObserver(ClickableObserver observer) {observers.remove(observer);}public String toString() {return "按钮颜色:"+color+",坐标"+x+","+y;}
}
3.4 定义具体观察者
观察者1
package Observer;
/*** 具体观察者:改变颜色观察者*/
public class ChangeColorObserver implements ClickableObserver{@Overridepublic void clicked(Clickable clickable) {Button b=(Button)clickable;b.color="紫色";System.out.println("具体观察者(ChangeColorObserver):我收到了主题更新的通知,将主题Button颜色做了改变");}
}
观察者2
package Observer;
/*** 具体观察者-改变坐标的观察者*/
public class ChangeCoordinateObserver implements ClickableObserver{@Overridepublic void clicked(Clickable clickable) {Button b=(Button)clickable;b.x=100;b.y=90;System.out.println("具体观察者(ChangeCoordinateObserver):我收到了主题更新的通知,将主题的坐标做了改变");}
}
观察者3
package Observer;
/*** 其他观察者*/
public class OtherObserver implements ClickableObserver{@Overridepublic void clicked(Clickable clickable) {System.out.println("具体观察者(OtherObserver):我收到了主题更新的通知");}
}
3.5 定义测试主方法
package Observer;public class TestMain {public static void main(String[] args) {//观察者的主程序Button button = new Button(); // 定义主题对象button.color="红色"; // 设置主题属性button.x=0; // 设置主题属性button.y=0; // 设置主题属性System.out.println(button);// 添加多个观察者,用以观察主题button.addClickableObserver(new ChangeColorObserver());button.addClickableObserver(new ChangeCoordinateObserver());button.addClickableObserver(new OtherObserver());// 主题被"点击",通知所有观察者button.click();// 打印主题信息System.out.println(button);}
}
输出信息如下:
参考文献:《Head First设计模式(中文版)》弗里曼
【设计模式】观察者模式Observe(Java)相关推荐
- 设计模式-观察者模式(Observer)-Java
设计模式-观察者模式(Observer)-Java 目录 文章目录 1.前言 2.示例案例-多人联机对战游戏的设计 3.观察者模式概述 3.1.观察者模式定义 3.2.观察者模式结构 3.3.观察者模 ...
- 设计模式 - 行为型设计模式 - 观察者模式(Java)
分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 观察者模式对于我们来说,真是再简单不过了.无外乎两个 ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- python观察者模式observe
python设计模式观察者模式observe 观察者模式是一个软件设计模式,一个主题对象博包涵一系列依赖他的观察者,自动通知观察者的主题对象的改变,通常会调用每个观察者的一个方法.这个设计模式非常适用 ...
- 设计模式(四) Observe——观察者模式
设计模式四 Observe--观察者模式 观察者模式 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于 ...
- 设计模式总结(Java)—— 观察者模式
概述 它用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应.在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多 ...
- Java设计模式-观察者模式(订阅发布模式)
Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...
- 设计模式---观察者模式介绍与理解
设计模式---观察者模式介绍与理解: 观察者模式原理:类似于定牛奶业务 1. 奶站,subject:登记注册,移除,通知(register,remove,notify) 2. 用户,observer: ...
- 设计模式 | 观察者模式及典型应用
本文主要内容: 介绍观察者模式 微信公众号的发布/订阅示例 观察者模式总结 分析观察者模式的典型应用 JDK 提供的观察者接口中的观察者模式 Guava EventBus 中的观察者模式 JDK 委托 ...
- java设计模式有哪些(java设计模式刘伟课后答案)
Java设计模式之Flyweight模式是怎样的? Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个对象存储池(Flyweight Pool)来存放内部状态的对 ...
最新文章
- mysql选择行_在mysql中选择特殊行
- 一、静态工厂的第四个优点是返回对象的类可以根据输入参数的不同而不同。...
- linux 系统 安装 nginx 服务
- 千亿级市场赛道,阿里云视频云拿下 “三连冠”
- mysql锁机制(Innodb引擎)
- mysql慕课网笔记_mysql学习笔记
- react组件卸载调用的方法_好程序员web前端培训分享React学习笔记(三)
- USACO-Section1.2 Broken Necklace (枚举法)
- POSIX:可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX )
- dedecms sphinx 配置
- mvc路由原理 php_s-blog博客系统开发之前端路由配置
- 学妹QQ被盗!我连夜用Python制作密码强度检查器!
- ANSYS 有限元分析 网格划分
- 计算机专业职业生涯规划200字,计算机职业生涯规划 200字
- 利用python合并关联两个表中的数据
- 电商和新媒体运营是做什么的
- MIPI DSI协议笔记
- Linux——虚拟内存空间分布
- 阿里云免费服务器测试题答案
- MySql查询某一天的数据
热门文章
- EXCEL插件制作闪信霸屏通知让通知更高效
- 量子计算机能解开人体秘密,人类解开人体“封印”的秘密
- 在Ubuntu中安装bwa和samtools的问题汇总
- windows中用cmd 删除文件夹以及文件夹里面的所有内容
- 说说你曾经最拼命地时候吧
- JAVA Swing 怎么把背景色或者前景色设置为自己想要的颜色呢?
- opencv心得体会_opencv学习心得第一章
- echart3.0正负图取数据java代码
- 接上一篇:【Vue 项目打包后访问报错:Uncaught TypeError: Cannot read property 'call' of undefined】
- 【原创】vSAN推荐的IO控制器的配置方式