java 建模_Java设计模式菜鸟系列(两)建模与观察者模式的实现

本文介绍了Java中的观察者模式,通过一个买菜的例子展示了如何使用Observable类和Observer接口创建一对多的依赖关系。当小商贩(被观察者)更新菜价时,会自动通知所有已注册的顾客(观察者)。在实际应用中,观察者模式常用于GUI框架和气象观察等场景。在通知观察者之前,必须先调用setChanged()方法设置状态改变,然后调用notifyObservers()方法更新观察者。
摘要由CSDN通过智能技术生成

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

Java对观察者模式的支持主要体如今Observable类和Observer接口。

先看uml模型图:

一、UML模型图

Center

二、代码实现

/** 演示样例:咱们去菜市场买菜

*

* 小商贩--主题

*/

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模型进行详细的代码实现,如图:附源代码

9b691a35f2af215b3f62462cce254073.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值