转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39755577

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

先看uml模型图:

一、UML模型图

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGh5X3ljdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

二、代码实现

/** 演示样例:咱们去菜市场买菜
*
* 小商贩--主题
*/
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模型进行详细的代码实现,如图:附源代码




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

Java设计模式菜鸟系列(两)建模与观察者模式的实现的更多相关文章

  1. Java设计模式菜鸟系列(十三)建模和实现状态模式

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39829859 状态模式(State):同意对象在内部状态改变时改变它的行为,对象看起来好像 ...

  2. Java设计模式菜鸟系列(一)策略模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39721563 今天開始咱们来谈谈Java设计模式. 这里会结合uml图形来解说,有对uml ...

  3. Java设计模式菜鸟系列(十四)代理模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39856435 代理模式(Proxy):代理模式事实上就是多一个代理类出来,替原对象进行一些 ...

  4. Java设计模式菜鸟系列(九)外观模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39805735 外观模式(Facade):是为了解决类与类之间的依赖关系的,像spring一 ...

  5. Java设计模式菜鸟系列(七)命令模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39804057 命令模式(Command):将"请求"(命令/口令)封装 ...

  6. Java设计模式菜鸟系列(十七)桥接模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40008711 桥接模式(Bridge): 把事物和其详细实现分开(抽象化与实现化解耦),使 ...

  7. Java设计模式菜鸟系列(十)模板方法模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39806973 模板方法模式(Template Method):在一个方法中定义了一个算法的 ...

  8. Java设计模式菜鸟系列(十五)建造者模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39863125 建造者模式(Builder):工厂类模式提供的是创建单个类的模式.而建造者模 ...

  9. Java设计模式菜鸟系列(二十二)中介者模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40027109 中介者模式(Mediator):主要用来减少类与类之间的耦合的,由于假设类与 ...

随机推荐

  1. unix解释器文件详解

    exec执行普通文件和解释器文件的区别 2014-11-15 23:52:45 分类: LINUX exec执行普通文件和解释器文件的区别 ——lvyilong316 1. 从一个问题开始 首先要从项 ...

  2. Http协议学习总结(转)

    因为项目中很多地方都与Http协议有关,零散的了解了一下Http协议,但是没有系统的学习过. 今天根据网上其他同学的整理,加上我的一些经验,我也整理了一份.当做学习记录吧. 一.什么是HTTP协议 H ...

  3. 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

  4. MySQL中CASE的使用

    语法说明: 方式一: CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE ...

  5. Linux好书、经典书籍推荐

    Linux好书.经典书籍推荐 思想篇 <Linux/Unix设计思想> 图书将Unix与Linux的原理有效地结合起来,总结了Unix/Linux软件开发中的原则.在保留了第1版中Unix ...

  6. Python数据结构-序列

    shopList=['apple','orange','pen'] print(shopList) print(]) print(]) print(:])) print(])) 运行结果: ['app ...

  7. poj3126解题报告

    题意:简单的说就是:有一个人门牌号是一个四位数的整数,并且还是一个素数,现在他想要换成另外一个四位数且是素数的门牌号,而且,每次都只能更换这个四位数的一个位置的数 ,也就是每换一次都只改变一个数字,而 ...

  8. windows phone 7 通过Post提交URL到服务器,从服务器获取数据(比如登陆时候使用)

    原文:windows phone 7 通过Post提交URL到服务器,从服务器获取数据(比如登陆时候使用) HttpWebRequest myRequest = (HttpWebRequest)Web ...

  9. oracle nologging用法(转)

    一.oracle日志模式分为(logging,force logging,nologging) 默认情况是logging,就是会记录到redo日志中,force logging是强制记录日志,nolo ...

  10. 【原创】leetCodeOj --- Sliding Window Maximum 解题报告

    天,这题我已经没有底气高呼“水”了... 题目的地址: https://leetcode.com/problems/sliding-window-maximum/ 题目内容: Given an arr ...