从java类库看设计模式

从java类库看设计模式

ID:18532694

大小:253.00 KB

页数:28页

时间:2018-09-18

从java类库看设计模式_第1页
从java类库看设计模式_第2页
从java类库看设计模式_第3页
从java类库看设计模式_第4页
从java类库看设计模式_第5页
资源描述:

《从java类库看设计模式》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、从Java类库看设计模式(1)Observer模式Observer模式的功用,是希望两个(或多个)对象,我们称之为Subject和Observer,当一方的状态发生改变的时候,另一方能够得到通知。也就是说,作为Observer的一方,能够监视到Subject的某个特定的状态变化,并为之做出反应。一个简单的例子就是:当一个用户视图中的数据被用户改变后,后端的数据库能够得到更新,而当数据库被其他方式更新后,用户视图中的数据显示也会随之改变。图一:Obverser模式的类图 在JDK中实际上有一个对Ob

2、server模式的简单的实现:就是类java.util.Observerable和接口java.util.Observer。java.util.Observerable类对应于Subject,而java.util.Observer就是观察者了。JDK中并没有把这两个部分都设计为接口,而是让类java.util.Observerable提供了部分的实现,简化了许多编程的工作。当然,这也减少了一定的灵活性。下面列出了Observer和Observeral的函数列表,及其简单的功能说明java.util

3、.Observer:publicvoidupdate(Observableobs,Objectobj)java.util.Observer接口很简单,只定义了这一个方法,狭义的按照Observer模式的说法,Observer应该在这个方法中调用Subject的getXXX()方法来取得最新的状态,而实际上,你可以只是在其中对Subject的某些事件进行响应。这便是Java中的代理事件模型的一个雏形--对事件进行响应。只不过,在Observer模式中将事件特定化为某个状态/数据的改变了。java.u

4、til.ObservablepublicvoidaddObserver(Observerobs)向Subject注册一个Observer。也就是把这个Observer对象添加到了一个java.util.Observable内部的列表中。在JDK中对于这个列表是简单的通过一个java.util.Vector类来实现的,而实际上,在一些复杂的Observer模式的应用中,需要把这个部分单另出来形成一个Manager类,来管理Subject和Observer之间的映射。这样,Subject和Observ

5、er进一步的被解藕,程序也会具有更大的灵活性。publicvoiddeleteObserver(Observerobs)从Subject中删除一个已注册了Observer的引用。protectedvoidsetChanged()设置一个内部的标志以指明这个Ovserver的状态已经发生改变。注意这是一个protected方法,也就是说只能在Observer类和其子类中被调用,而在其它的类中是看不到这个方法的。publicvoidnotifyObservers(Objectobj)它首先检查那个内部

6、的标志,以判断状态是否改变,如果是的话,它会调用注册在Subject中的每个Observer的update()方法。在JDK中这个方法内部是作为synchronized来实现的,也就是如果发生多个线程同时争用一个java.util.Observerable的notifyObservers()方法的话,他们必须按调度的等待着顺序执行。在某些特殊的情况下,这会有一些潜在的问题:可能在等待的过程中,一个刚刚被加入的Observer会被遗漏没有被通知到,而一个刚刚被删除了的Observer会仍然收到它已经

7、不想要了的通知。 1package javamodel.observer; 3import java.util.Observable; 4import java.util.Observer; 7* 猫叫,老鼠跑,主人被惊醒,用代码实现这个连锁反应 。 8* @author Administrator1112public class TestObserver {14public static void main(String[] args){15   Cat c=new Cat();16   Obs

8、erver o1=new Mouse();17   Observer o2=new Man();18   c.addObserver(o1);19   Mouse oo1=(Mouse)o1;//向下转型20   oo1.addObserver(o2);21   c.CatSay();22}24}2526class Cat extends Observable{//猫被老鼠观察,猫是被观察者28public void CatSay(){29   System.out.println

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。