ImageVerifierCode 换一换
格式:DOCX , 页数:35 ,大小:162.24KB ,
资源ID:20065205      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/20065205.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(从Java类库看设计模式Word文档下载推荐.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

从Java类库看设计模式Word文档下载推荐.docx

1、当然,这也减少了一定的灵活性。下面列出了Observer和Observeral的函数列表,及其简单的功能说明java.util.Observer:public void update(Observable obs, Object obj)java.util.Observer 接口很简单,只定义了这一个方法,狭义的按照Observer模式的说法,Observer应该在这个方法中调用Subject的getXXX()方法来取得最新的状态,而实际上,你可以只是在其中对Subject的某些事件进行响应。这便是Java中的代理事件模型的一个雏形-对事件进行响应。只不过,在Observer模式中将事件特定化

2、为某个状态/数据的改变了。java.util.Observablepublic void addObserver(Observer obs)向Subject注册一个Observer。也就是把这个Observer对象添加到了一个java.util.Observable内部的列表中。在JDK中对于这个列表是简单的通过一个java.util.Vector类来实现的,而实际上,在一些复杂的Observer模式的应用中,需要把这个部分单另出来形成一个Manager类,来管理Subject和Observer之间的映射。这样,Subject和Observer进一步的被解藕,程序也会具有更大的灵活性。publ

3、ic void deleteObserver(Observer obs)从Subject中删除一个已注册了Observer的引用。public void deleteObservers()从Subjec中删除所有注册的Observer的引用。public int countObservers()返回注册在Subject中的Observer个数。protected void setChanged()设置一个内部的标志以指明这个Ovserver的状态已经发生改变。注意这是一个protected方法,也就是说只能在Observer类和其子类中被调用,而在其它的类中是看不到这个方法的。protecte

4、d void clearChanged()清除上叙的内部标志。它在notifyObservers()方法内部被自动的调用,以指明Subject的状态的改变已经传递到Ovserver中了。public boolean hasChanged()确定Subject的状态是否发生了改变。public void notifyObservers(Object obj)它首先检查那个内部的标志,以判断状态是否改变,如果是的话,它会调用注册在Subject中的每个Observer的update()方法。在JDK中这个方法内部是作为synchronized来实现的,也就是如果发生多个线程同时争用一个java.u

5、til.Observerable的notifyObservers()方法的话,他们必须按调度的等待着顺序执行。在某些特殊的情况下,这会有一些潜在的问题:可能在等待的过程中,一个刚刚被加入的Observer会被遗漏没有被通知到,而一个刚刚被删除了的Observer会仍然收到它已经不想要了的通知。public void notifyObservers()等价于调用了notifyObservers(null)。因而在Java中应用Observer就很简单了,需要做的是:让需要被观察的Subject对象继承java.util.Observerable,让需要观察的对象实现java.util.Obser

6、ver接口,然后用java.util.Observerable的addObserver(Observer obj)方法把Observer注册到Subject对象中。这已经完成了大部分的工作了。然后调用java.util.Observerable的notifyObservers(Object arg)等方法,就可以实现Observer模式的机理。我们来看一个简单使用了这个模式的例子。这个例子有三个类:FrameSubject,DateSubject,FrameObject和EntryClass,FrameSubject中用户可以设置被观察的值,然后自动的会在FrameObject中显示出来,Da

7、teSubject封装被观察的值,并且充当Observer模式中的Subject。1 public class FrameSubject extends JFrame 2 3 .4 5 /因为无法使用多重继承,这儿就只能使用对象组合的方式来引入一个6 7 /java.util.Observerable对象了。8 9 DateSubject subject=new DateSubject();10 11 /这个方法转发添加Observer消息到DateSubject。12 13 public void registerObserver(java.util.Observer o)14 15 sub

8、ject.addObserver(o);16 17 18 19 /数据改变,事件被触发后调用notifyObservers()来通知Observer。20 21 void jButton1_actionPerformed(ActionEvent e) 22 23 subject.setWidthInfo(Integer.parseInt(jTextField1.getText();24 25 subject.setHeightInfo(Integer.parseInt(jTextField2.getText();26 27 subject.notifyObservers();28 29 30

9、31 32 33 34 35 public class DateSubject extends Observable 36 37 /封装被观察的数据38 39 private int widthInfo;40 41 private int heightInfo;42 43 public int getWidthInfo() 44 45 return widthInfo;46 47 48 49 public void setWidthInfo(int widthInfo) 50 51 this.widthInfo = widthInfo;52 53 /数据改变后,setChanged()必须被调

10、用,否则notifyObservers()方法会不起作用54 55 this.setChanged();56 57 58 59 public void setHeightInfo(int heightInfo) 60 61 this.heightInfo = heightInfo;62 63 this.setChanged();64 65 66 67 public int getHeightInfo() 68 69 return heightInfo;70 71 72 73 74 75 public class FrameObserver extends JFrame implements j

11、ava.util.Observer 76 77 .78 79 /观察的数据80 81 int widthInfo=0;82 83 int heightInfo=0;84 85 /在update()方法中实现对数据的更新和其它必要的反应。86 87 public void update(Observable o, Object arg) 88 89 DateSubject subject=(DateSubject) o;90 91 widthInfo=subject.getWidthInfo();92 93 heightInfo=subject.getHeightInfo();94 95 jLa

12、bel1.setText(The heightInfo from subject is: );96 97 jLabel3.setText(String.valueOf(heightInfo);98 99 jLabel2.setText(The widthInfo from subject is:100 101 jLabel4.setText(String.valueOf(widthInfo);102 103 104 105 .106 107 108 109 public class EntryClass 110 111 public static void main(String args)

13、112 113 .114 115 FrameSubject frame = new FrameSubject();116 117 FrameObserver frame2=new FrameObserver();118 119 /在Subject中注册Observer,将两者联系在一起120 121 frame.registerObserver(frame2);122 123 .124 125 frame.setVisible(true);126 127 frame2.setVisible(true);128 129 .130 131 132 133 134 135我认为在JDK中这个Obse

14、rver模式的实现,对于一般的Observer模式的应用,已经是非常的足够了的。但是一方面它用一个类来实现了Subject,另一方面它使用Vector来保存Subject对于Observer的引用,这虽然简化了编程的过程,但会限制它在一些需要更为灵活,复杂的设计中的应用,有时候(虽然这种情况不多),我们还不得不重新编写新的Subject对象和额外的Manager对象来实现更为复杂的Observer模式的应用。随着现代软件工业的不断进步,软件系统的规模的日益扩大,越来越需要对某些个不断出现的问题进行模式化思维,以成功的经验或者失败的教训来减少软件开发失败的风险。模式代表了一种文档化的经验,它为某

15、一类的问题提供了最好(或者说很好)的解决方案,使得即使不是经验丰富的软件工程师,也能够根据模式来构建相对成功的系统。本节给出的一个Obverser模式的示例,比较好的说明了这一点。Obverser模式主要解决在对象间的状态映射或者镜像的问题。在设计一般用途的软件的时候,在C或者C+语言中,用的很多的一个技巧就是回调函数(Callback),所谓的回调函数,意指先在系统的某个地方对函数进行注册,让系统知道这个函数的存在,然后在以后,当某个事件发生时,再调用这个函数对事件进行响应。在C或者C+中,实现的回调函数方法是使用函数指针。但是在Java中,并不支持指针,因而就有了Command模式,这一回

16、调机制的面向对象版本。Command模式用来封装一个命令/请求,简单的说,一个Command对象中包含了待执行的一个动作(语句)序列,以执行特定的任务。当然,并不是随便怎么样的语句序列都可以构成一个Command对象的,按照Command模式的设计,Command对象和它的调用者Incvoker之间应该具有接口约定的。也就是说,Invoker得到Command对象的引用,并调用其中定义好的方法,而当Command对象改变(或者是对象本身代码改变,或者干脆完全另外的一个Command对象)之后,Invoker中的代码可以不用更改。这样,通过封装请求,可以把任务和任务的实现加以分离。图二:Comm

17、and模式的类图而对于请求的处理又有两种不同的方法,一种是Command只充当代理,将请求转发给某个接受者对象,还有一种是Command对象自己处理完所有的请求操作。当然,这只是两个极端,更多的情况是Command完成一部分的工作,而另外的一部分这则交给接受者对象来处理。在新的JDK的代理事件模型中,就可以看作是这样的一个Command模式。在那个模型中,一个事件监听者类EventListener监听某个事件,并根据接口定义,实现特定的操作。比如,当用Document对象的addDocumentListener(DocumentListener listener) 方法注册了一个Documen

18、tListener后,以后如果在Document对象中发生文本插入的事件,DocumentListener中实现的insertUpdate(DocumentEvent e)方法就会被调用,如果发生文本删除事件,removeUpdate(DocumentEvent e)方法就会被调用。怎么样,想想看,这是不是一个Command模式的应用呢?然而,最经典的Command模式的应用,莫过于Swing中的Action接口。Action实际上继承的是ActionListener,也就是说,它也是一个事件监听者(EventListener)。但是Action作为一种ActionListener的扩展机制,

19、提供了更多的功能。它可以在其中包含对这个Action动作的一个或者多个文字的或图标的描叙,它提供了Enable/Disable的功能许可性标志。并且,一个Action对象可以被多个Invoker,比如实现相同功能的按钮,菜单,快捷方式所共享。而这些Invoker都知道如何加入一个Action,并充分利用它所提供的扩展机制。可以说,在这儿Action更像一个对象了,因为它不仅仅提供了对方法的实现,更提供了对方法的描叙和控制。可以方便的描叙任何的事务,这更是面向对象方法的威力所在。下面我们看一个Command模式的应用的例子。假设要实现这样的一个任务:Task Schedule。也就是说,我想对多

20、个任务进行安排,比如扫描磁盘,我希望它每1个小时进行一次,而备份数据,我希望它半个小时进行一次,等等等等。但是,我并不希望作为TaskSchedule的类知道各个任务的细节内容,TaskSchedule应该只是知道Task本身,而对具体的实现任务的细节并不理会。因而在这儿,我们就需要对TaskSchedule和Task进行解耦,将任务和具体的实现分离出来,这不正是Command模式的用武之地吗?图三:Command模式的应用例子程序清单:1 /抽象的Task接口,作为回调的Command模式的主体2 public interface Task 3 public void taskPerform

21、();4 5 /具体的实现了Task接口的子类,实现特定的操作。6 public class BackupTask implements Task7 public void taskPerform()8 System.out.println(Backup Task has been performed9 10 11 /具体的实现了Task接口的子类,实现特定的操作。12 public class ScanDiskTask implements Task13 14 ScanDisk Task has been performed15 16 17 /一个封装了Task的一个封装类,提供了一些与Ta

22、sk相关的内容,也可以把这些内容18 /这儿不过为了突出Command模式而把它单另出来,实际上可以和Task合并。19 public class TaskEntry 20 private Task task;21 private long timeInterval;22 private long timeLastDone;23 public Task getTask() 24 return task;25 26 public void setTask(Task task) 27 this.task = task;28 29 public void setTimeInterval(long t

23、imeInterval) 30 this.timeInterval = timeInterval;31 32 public long getTimeInterval() 33 return timeInterval;34 35 public long getTimeLastDone() 36 return timeLastDone;37 38 public void setTimeLastDone(long timeLastDone) 39 this.timeLastDone = timeLastDone;40 41 public TaskEntry(Task task,long timeIn

24、teral)42 this.task=task;43 this.timeInterval =timeInteral;44 45 46 /调度管理Task的类,继承Thread只是为了调用其sleep()方法,47 /实际上,如果真的作Task调度的话,每个Task显然应该用单独的Thread来实现。48 public class TaskSchedule extends java.lang.Thread 49 private java.util.Vector taskList=new java.util.Vector();50 private long sleeptime=1000000000

25、0l;/最短睡眠时间51 public void addTask(TaskEntry taskEntry)52 taskList.add(taskEntry);53 taskEntry.setTimeLastDone(System.currentTimeMillis();54 if (sleeptimetaskEntry.getTimeInterval() 55 sleeptime=taskEntry.getTimeInterval();56 57 /执行任务调度58 public void schedulePermorm()59 try60 sleep(sleeptime);61 Enumeration e = taskList.elements();62 while (e.hasMoreElements() 63 TaskEntry te = (TaskEntry) e.nextElement();64 if (te.getTimeInterval() + te.getTimeLastDone()

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1