版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 | HYPERLINK / 百度首页 HYPERLINK /v2/?login 登录 HYPERLINK /cashier/browse/vipcashier?dqStatCode=topnav_joinvip&cashier_code=topnav_joinvip VIP意见反馈 HYPERLINK /apps?fr=1011 下载客户端4/13/2019JAVA观察者模式详细介绍及应用 - 百度文库 HYPERLINK /?fr=nav 首页 HYPERLINK javascript:void(0); 分类 HYPERLINK javascript:void(0); 精品内容 HYPER
2、LINK /wenkuverify?from=1 申请认证 HYPERLINK javascript:void(0); 机构合作 HYPERLINK javascript:void(0); 频道专区 HYPERLINK /xtopic/wkback 百度智慧课堂 HYPERLINK /user/browse/vip/ 百度教育VIP HYPERLINK /?fr=crumbs 百度文库 HYPERLINK /?fr=crumbs HYPERLINK /pro/index 专业资料 HYPERLINK /pro/index HYPERLINK /list/230 工程科技 HYPERLINK /
3、list/230 HYPERLINK /list/154 电子/电路Java 的设计模式很多,观察者模式被称为是模式中的皇后,而且 Java jdk 也对它做了实现,可见该设计模式的重要位置。在图形化设计的软件中,为了实现视图和事件处理的分离,大多都采用了 Observer 模式,比如 Java 的 Swing,Flex 的 ActionScript等。在现实的应用系统中也有好多应用,比如像当当网、京东商城一类的电子商务网站,如果你对某件商品比较关注,可以放到收藏架,那么当该商品降价时,系统给您发送手机短信或邮件。这就是观察者模式的一个典型应用,商品是被观察者,有的叫主体;关注该商品的客户就是
4、观察者。下面的一个事例将模拟这个应用。GoF 说道:Observer 模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 ”。从这段话里我们可以得到两个信息,如下:1, 观察者(具体执行操作的对象,有多个)2, 被观察者(顾名思义是被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操)jdk在 java 的 util 包中实现了该设计模式的框架,大部分应用都可以直接用它,当然了你也可以自己实现它,实际上就是一个被观察者的抽象类和一个观察者接口。我们先看一下 jdk 是如何实现的。被观察者的抽象类 java.util.Ob
5、servablepackage java.util;public class Observable private boolean changed = false;private Vector obs;/创建被观察者时就创建一个它持有的观察者列表,注意,这个列表是需要同步的。public Observable() obs = new Vector();/* 添加观察者到观察者列表中去*/public synchronized void addObserver(Observer o) if (o = null)throw new NullPointerException();if (!obs.c
6、ontains(o) obs.addElement(o);/* 删除一个观察者*/view/0a2e3d14cd1755270722192e453610661ed95ab3.html1/6 4/13/2019JAVA观察者模式详细介绍及应用 - 百度文库public synchronized void deleteObserver(Observer o) obs.removeElement(o);public void notifyObservers() notifyObservers(null);/* 通知操作,即被观察者发生变化,通知对应的观察者进行事先设定的操作 ,这个方法接受一个参数,
7、这个参数一直传到观察者里,以供观察者使用*/public void notifyObservers(Object arg) Object arrLocal;synchronized (this) if (!changed)return;arrLocal = obs.toArray();clearChanged();for (int i = arrLocal.length-1; i=0; i-)(Observer)arrLocali).update(this, arg);public synchronized void deleteObservers() obs.removeAllElement
8、s();protected synchronized void setChanged() changed = true;protected synchronized void clearChanged() changed = false;public synchronized boolean hasChanged() return changed;public synchronized int countObservers() return obs.size();当我们自己的被观察者继承这个 Observable 类是,我们就自动的获取到被观察者的一切条件了。很方便是不是,这也是为什么 sun
9、 要把 Observable 放到 java.util 包中的原因,就是为了方便开发者。下面我们再看一下观察者的接口 java.util.Observerpackage java.util;public interface Observer /view/0a2e3d14cd1755270722192e453610661ed95ab3.html2/6 4/13/2019JAVA观察者模式详细介绍及应用 - 百度文库void update(Observable o, Object arg);接口中就只有一个方法,update,方法中有两个参数,Observable 和一个 object,第一个参数
10、就是被观察的对象,而第二个参数就得看业务需求了,需要什么就传进去什么。我们自己的观察者类必须实现这个方法,这样在被观察者调用 notifyObservers 操作时被观察者所持有的所有观察者都会执行 update 操作了.下面是一个 book 对象,它是一个被观察者,所以要继承 Observable。import java.util.Observable;public class Book extends Observable private String name = ;private double price = 0.0;public String getName() return nam
11、e;public void setName(String name) = name;public double getPrice() return price;public void setPrice(double price) this.price = price;/当书的价格修改时调用该方法public void modifyPrice(Book b) /调用父类的方法,改变被观察者的状态setChanged();/通知客户该书已降价notifyObservers(b);下面是观察者对象,表示顾客的电子邮件,它实现了 Observer 接口。import java.util.Observa
12、ble;import java.util.Observer;public class BuyerEmail implements Observer /view/0a2e3d14cd1755270722192e453610661ed95ab3.html3/6 4/13/2019JAVA观察者模式详细介绍及应用 - 百度文库private String buyerId = ;private String email = ;public String getBuyerId() return buyerId;public void setBuyerId(String buyerId) this.buy
13、erId = buyerId;public String getEmail() return email;public void setEmail(String email) this.email = email;/该方法会被“被观察者的父类”既 Observable 调用public void update(Observable o, Object arg) /这里做具体发电子邮件的操作Book b = (Book)arg;System.out.println(给顾客的发电子邮件:+b.getName()+降价了,目前价格为:+b.getPrice();下面是另一个观察者对象,表示顾客的手机
14、,同样需要继承 Observer 接口import java.util.Observable;import java.util.Observer;public class BuyerMobileMessage implements Observer private String buyerId = ;private String mobileNo = ;public String getBuyerId() return buyerId;public void setBuyerId(String buyerId) this.buyerId = buyerId;public String getM
15、obileNo() return mobileNo;public void setMobileNo(String mobileNo) this.mobileNo = mobileNo;public void update(Observable o, Object arg) /view/0a2e3d14cd1755270722192e453610661ed95ab3.html4/6 4/13/2019JAVA观察者模式详细介绍及应用 - 百度文库/ TODO Auto-generated method stubBook b = (Book)arg;System.out.println(给顾客的发
16、手机短信:+b.getName()+降价了,目前价格为:+b.getPrice();下面是调用类:public class MainApp public static void main(String args)Book b1 = new Book();b1.setName();b1.setPrice(45.00);/假设原价是 60,现在是降价促销/下面的观察者在实际的应用中可以从数据库或文件中读取BuyerMobileMessage bm = new BuyerMobileMessage();bm.setBuyerId(001);bm.setMobileNo(138*);BuyerEmail be = new BuyerEmail();be.setBuyerId(001);be.setEmail();/增加观察者,在实际应用中就是那些人对该书做了关注b1.addObserver(bm);b1.addObserver(be);b1.modifyPrice(b1);输出:给顾客的发电子邮件:降价了,目前价格为:45.0给顾客的发手机短信:降价了,目前价格为:45.0不知道上面的例子你看懂了没有,观察者模式实际上没
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度智能城市建设项目管理承包合同4篇
- 二零二五年度农业科技创新平台建设合同标准4篇
- 二零二五版美容美发院设备升级改造工程合同4篇
- 二零二五年度协议离婚时间控制与婚姻解除后续法律咨询合同2篇
- 2025年度离婚协议中子女国际交流及旅行安排合同4篇
- 二零二五年度环境整治与智慧城市建设合同模板
- 二零二五年度租赁合同物业管理补充协议范本
- 2025年度租赁房屋合同申请流程优化及风险防范措施
- 二零二五年度深圳租房合同纠纷处理指南
- 二零二五年度酒吧租赁合同(含年度品牌形象宣传)
- 湖北省十堰市城区2024-2025学年九年级上学期期末质量检测综合物理试题(含答案)
- 2024企业答谢晚宴会务合同3篇
- 电气工程及其自动化专业《毕业设计(论文)及答辩》教学大纲
- 《客舱安全管理与应急处置》课件-第14讲 应急撤离
- 中华人民共和国文物保护法
- 节前物业安全培训
- 阿里巴巴国际站:2024年珠宝眼镜手表及配饰行业报告
- 高甘油三酯血症相关的器官损伤
- 手术室护士考试题及答案
- 牙膏项目创业计划书
- 单位食堂供餐方案
评论
0/150
提交评论