多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
观察者(Observer)模式定义:在对象之间定义了一对多的依赖关系,这样一来,当一个对象改变状态时,依赖它的对象都会收到通知并自动跟新。Java已经提供了对观察者Observer模式的默认实现, Java对观察者模式的支持主要体现在Observable类和Observer接口。先看uml模型图: ## 一、UML模型图 **![](https://box.kancloud.cn/2016-02-19_56c7196cdf841.jpg)** ## 二、代码实现 ~~~ /**示例:咱们去菜市场买菜 * * 小商贩--主题 */ 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 + "元/斤"); } } } /** * 客户端测试类 * * @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模型进行具体的代码实现,如图:[**附源码**](http://download.csdn.net/detail/jave_lover/8000095) ![](https://box.kancloud.cn/2016-02-19_56c7196cf2ba9.jpg)