博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java设计模式菜鸟系列(两)建模与观察者模式的实现
阅读量:6152 次
发布时间:2019-06-21

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

转载请注明出处:

观察者(Observer)模式定义:在对象之间定义了一对多的依赖关系,这样一来。当一个对象改变状态时,依赖它的对象都会收到通知并自己主动跟新。Java已经提供了对观察者Observer模式的默认实现, Java对观察者模式的支持主要体如今Observable类和Observer接口。

先看uml模型图:

一、UML模型图

二、代码实现

/** 演示样例:咱们去菜市场买菜 *  * 小商贩--主题 */class Food extends Observable {	/** 菜名 */	private String name;	/** 菜价 */	private float price;	public Food(String name, float price) {		this.name = name;		this.price = price;	}	public String getName() {		return name;	}	public float getPrice() {		return price;	}	public void setPrice(float price) {		this.price = price;		/**		 * 设置菜价的状态已经被改变		 */		this.setChanged();		/**		 * 通知【全部】正在看菜(已经注冊了)的顾客,然后回调Observer的update方法进行更新		 * 		 * 这里能够体现对象的一对多:一个小商贩一旦更新价格(即一个对象改变状态)。便会自己主动通知全部的顾客(依赖它的对象都会收到通知)		 * 并自己主动update		 */		this.notifyObservers(price);	}}/** * 顾客 --观察者 */class Customer implements Observer {	private String name;	public Customer(String name) {		this.name = name;	}	public String getName() {		return name;	}	@Override	public void update(Observable o, Object arg) {		if (o instanceof Food && arg instanceof Float) {			Food food = (Food) o;			float price = (Float) arg;			System.out.println("您好:" + this.name + " ," + food.getName()					+ "的价格已经发生改变。如今的价格为:" + price + "元/斤");		}	}}/** * client測试类 *  * @author Leo */public class Test {	public static void main(String[] args) {		Food food = new Food("土豆", 1.0f);		Customer zhangsan = new Customer("张三");		Customer lisi = new Customer("李四");		/**		 * 加入顾客		 */		food.addObserver(zhangsan);		food.addObserver(lisi);		/**		 * 更新价格		 */		food.setPrice(1.5f);	}}

三、应用场景

GUI框架、气象观察等

四、小结

在通知全部观察者之前一定要调用 setChanged()方法来设置被观察者的状态已经被改变,这样notifyObservers()才会回调Observer的update方法进行更新。

以上内容假设有不同的见解或疏忽的地方,还请大家提出宝贵的建议或意见。

最后大家能够试着将以下的uml模型进行详细的代码实现,如图:

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
Javascript一些小细节
查看>>
禁用ViewState
查看>>
Android图片压缩(质量压缩和尺寸压缩)
查看>>
nilfs (a continuent snapshot file system) used with PostgreSQL
查看>>
【SICP练习】150 练习4.6
查看>>
HTTP缓存应用
查看>>
KubeEdge向左,K3S向右
查看>>
DTCC2013:基于网络监听数据库安全审计
查看>>
CCNA考试要点大搜集(二)
查看>>
ajax查询数据库时数据无法更新的问题
查看>>
Kickstart 无人职守安装,终于搞定了。
查看>>
linux开源万岁
查看>>
linux/CentOS6忘记root密码解决办法
查看>>
25个常用的Linux iptables规则
查看>>
集中管理系统--puppet
查看>>
分布式事务最终一致性常用方案
查看>>
Exchange 2013 PowerShell配置文件
查看>>
JavaAPI详解系列(1):String类(1)
查看>>
HTML条件注释判断IE<!--[if IE]><!--[if lt IE 9]>
查看>>
发布和逸出-构造过程中使this引用逸出
查看>>