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

观察者(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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php多条件查询

需要查询的表格 代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <…

Airbert: In-domain Pretraining for Vision-and-Language Navigation

题目&#xff1a;Airbert&#xff1a;视觉和语言导航的域内预训练 摘要 为了解决VLN数据集稀缺的问题&#xff0c;本文创建了一个数据集BNB。我们首先从在线租赁市场的数十万个列表中收集图像标题 (IC) 对。接下来&#xff0c;我们使用 IC 对提出自动策略来生成数百万个 VLN …

os的java版本_如何在OS X上设置或更改默认的Java(JDK)版本?

首次运行/usr/libexec/java_home -V将输出如下内容&#xff1a;Matching Java Virtual Machines (3):1.8.0_05, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home1.6.0_65-b14-462, x86_64: "Java SE 6" /System…

Java占位符替换工具类

import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 配置文件或模板中的占位符替换工具类 * Date: 15-5-8 * Time: 下午4:12 */ public class PlaceholderUtils { private static final Logger logger L…

java switch 输入2_Java switch语句第二种用法

Java switch语句第二种用法package cn.geekeryi;public class SwitchTest02 {public static void main(String[] args) {short month 1;if (month1||month2||month3){System.out.println("这是一季度");}else if (month4||month5||month6){System.out.println("…

java手游 《剑心》_java

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼package txt2;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.swing.*;public class MyPanel…

实例讲解webpack的基本使用第二篇

这一篇来讲解一下如何设置webpack的配置文件webpack.config.js 我们新建一个webpack-demo的项目文件夹&#xff0c;然后安装webpack 执行如下命令 在项目文件夹下&#xff0c;建一个dist文件夹来放打包后的文件&#xff0c;以及一个src文件夹来放我们的代码文件 再建立一个inde…

java system.out.read_一个java文件操作小程序 system.out.in buffer read

按键 i buffer readabc123ET 0 97 代码停在此&#xff0c;等待输入 触发代码运行dET 0 …

Redis命令总结及其基础知识讲述

Redis命令总结及其基础知识讲述 1、redis的不同之处 Redis拥有其他数据库不具备的数据结构&#xff0c;又拥有内存存储&#xff08;这使得redis的速度非常快&#xff09;&#xff0c;远程操作&#xff08;使得redis可以与多个客户端和服务器进行连接&#xff09;、持久化&#…

appSettings 配置mysql_app.config数据库配置字符串的三种取法

关于VS2008或VS2005中数据库配置字符串的三种取法VS2008建立Form程序时,如果添加数据源会在配置文件app.config中自动写入连接字符串,这个字符串将会在你利用DataSet,SqlDataAparter,SqlConnection等控件时如影随行地提示你让去选择,或者是新建字符串。如果要用代码的方式取得这…

!!!!Linux系统开发 系列 4 进程资源 环境 fork()子进程 wait() waitpid()僵尸 孤儿进程...

http://990487026.blog.51cto.com/10133282/1834893转载于:https://www.cnblogs.com/zengkefu/p/6832235.html

java 当地时间_【JAVA】获取当地时间

Java代码 importjava.text.SimpleDateFormat;SimpleDateFormat formatter newSimpleDateFormat ("yyyy年MM月dd日 HH:mm:ss ");Date curDate newDate(System.currentTimeMillis());//获取当前时间String str formatter.format(curDate);impo…

js 原型prototype

function MyObject(name, size) {   this.name name;   this.size size; } MyObject.prototype.height "2.26 meters"; MyObject.prototype.tellHeight function() {   return "height of "this.name" is "this.height; } ///使用 …

java 优化线程_Java | 多线程调优(下):如何优化多线程上下文切换?

通过上一讲的讲解&#xff0c;相信你对上下文切换已经有了一定的了解了。如果是单个线程&#xff0c;在 CPU 调用之后&#xff0c;那么它基本上是不会被调度出去的。如果可运行的线程数远大于 CPU 数量&#xff0c;那么操作系统最终会将某个正在运行的线程调度出来&#xff0c;…

js 的正则表达式 部分展示test()方法的验证功能

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body><script> var patt1new RegExp("^[1-9][0-9]*$"); document.write(patt1.test("1…

java 工厂模式详解_java 工厂模式的实例详解

java 工厂模式的实例详解工厂方法中的“工厂”和我们平常理解的一样&#xff1a;用于生产产品。而客户是要和产品打交道&#xff0c;所以工厂方法模式的意义在于把客户和产品分开&#xff0c;达到解耦和更灵活的目的。一般我们有一个产品的抽象类&#xff0c;然后有几个具体的产…

用pfx证书java双向认证_把CA证书生成的crt的证书和pem的私钥转换成java能够使用的keystore和pcks12的证书,实现https双向认证...

最近在做一个https双向认证的工作&#xff0c;领导先让我实现&#xff0c;我之前写了一篇文章&#xff0c;把tomcat的生成证书和配置的实现写了出来。现在领导给了我服务器的CA证书的客户端证书和私钥&#xff0c;服务端信任证书&#xff0c;分别是crt和pem格式的文件&#xff…

jmail组件 java_Jmail的主要参数列表

说明&#xff1a;更多的信息请参考Jmail说明&#xff0c;我想这已经足够用的了。(1)Body(信件正文):字符串网络说明&#xff1a;更多的信息请参考Jmail说明&#xff0c;我想这已经足够用的了。(1)Body(信件正文) : 字符串如&#xff1a;JMail.Body "这里可以是用户填写的…

Go -- log4go日志

折腾&#xff1a; 【已解决】go语言中实现log信息同时输出到文件和控制台(命令行&#xff09; 期间&#xff0c;已经通过io的MultiWriter搞定了同时输出信息到文件和console&#xff0c;但是不支持level。 所以&#xff0c;再去试试这个log4go。 github.com/keepeye/log4go 【折…

mysql 查看索引命中_请问下如何在Mysql中where与orderBy后在命中索引?

我现在大概有一个需求&#xff0c;是需要在数据库中查询一个列表。数据表的样子大概是这样的&#xff1a;ABCDE1112016-08-0540...............而我现在的SQL语句大概是这样的SELECT * FROM TABLE WHERE B 1 AND C 1 AND D 2016-08-05 ORDER BY E DESC在这种情况下我应该怎么…