1700469160
1700469161
我们思考一下,修改后的程序运行结果正确,效率也比较高,是不是应该乐呵乐呵了?大功告成了?稍等等,你想在战国争雄的时候,韩非子这么有名望、有实力的人,就只有秦国关心他吗?想想也不可能呀,确实有一大帮的各国类似于李斯这样的人在看着他,监视着他的一举一动,但是看看我们的程序,你在HanFeiZi这个类中定义:
1700469162
1700469163
private ILiSi liSi=new LiSi();
1700469164
1700469165
这样一来只有李斯才能观察到韩非子,这是不对的,也就是说韩非子的活动只通知了李斯一个人,这不可能;再者说了,李斯只观察韩非子的吃饭、娱乐吗?政治倾向不关心吗?思维倾向不关心吗?杀人放火不关心吗?也就说韩非子的一系列活动都要通知李斯,这可怎么办?要按照上面的例子,我们如何修改?这和开闭原则严重违背呀,我们的程序有问题,修改如图22-4所示。
1700469166
1700469167
1700469168
1700469169
1700469170
图22-4 改进后的观察者和被观察者
1700469171
1700469172
我们把原有类图做了两个修改:
1700469173
1700469174
❑增加Observable
1700469175
1700469176
实现该接口的都是被观察者,那韩非子是被观察者,他当然也要实现该接口了,同时他还有与其他庸人相异的事要做,因此他还是要实现IHanFeizi接口。
1700469177
1700469178
❑修改ILiSI接口名称为Observer
1700469179
1700469180
接口名称修改了一下,这样显得更抽象化,所有实现该接口的都是观察者(类似李斯这样的)。
1700469181
1700469182
Observable是被观察者,就是类似韩非子这样的人,在Observable接口中有三个比较重要的方法,分别是addObserver增加观察者,deleteObserver删除观察者,notifyObservers通知所有的观察者,这是什么意思呢?我这里有一个信息,一个对象,我可以允许有多个对象来察看,你观察也成,我观察也成,只要是观察者就成,也就是说我的改变或动作执行,会通知其他的对象,看程序会更明白一点,先看Observable接口,如代码清单22-9所示。
1700469183
1700469184
代码清单22-9 被观察者接口
1700469185
1700469186
public interface Observable{
1700469187
1700469188
//增加一个观察者
1700469189
1700469190
public void addObserver(Observer observer);
1700469191
1700469192
//删除一个观察者
1700469193
1700469194
public void deleteObserver(Observer observer);
1700469195
1700469196
//既然要观察,我发生改变了他也应该有所动作,通知观察者
1700469197
1700469198
public void notifyObservers(String context);
1700469199
1700469200
}
1700469201
1700469202
这是一个通用的被观察者接口,所有的被观察者都可以实现这个接口。再来看韩非子的实现类,如代码清单22-10所示。
1700469203
1700469204
代码清单22-10 被观察者实现类
1700469205
1700469206
public class HanFeiZi implements Observable,IHanFeiZi{
1700469207
1700469208
//定义个变长数组,存放所有的观察者
1700469209
[
上一页 ]
[ :1.70046916e+09 ]
[
下一页 ]