1700469131
}
1700469132
1700469133
}
1700469134
1700469135
韩非子HanFeiZi实现类就把接口的两个方法实现就可以了,在每个方法中调用LiSi.update()方法,完成李斯观察韩非子的职责,李斯的接口和实现类都没有任何改变,请参考代码清单22-3、22-4。我们再来看看Client程序的变更,如代码清单22-8所示。
1700469136
1700469137
代码清单22-8 通过聚集方式的场景类
1700469138
1700469139
public class Client{
1700469140
1700469141
public static void main(String[]args){
1700469142
1700469143
//定义出韩非子
1700469144
1700469145
HanFeiZi hanFeiZi=new HanFeiZi();
1700469146
1700469147
//然后我们看看韩非子在干什么
1700469148
1700469149
hanFeiZi.haveBreakfast();
1700469150
1700469151
//韩非子娱乐了
1700469152
1700469153
hanFeiZi.haveFun();
1700469154
1700469155
}
1700469156
1700469157
}
1700469158
1700469159
李斯就不用在场景类中定义了,非常简单,运行结果相同,不再赘述。
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
接口名称修改了一下,这样显得更抽象化,所有实现该接口的都是观察者(类似李斯这样的)。
[
上一页 ]
[ :1.700469131e+09 ]
[
下一页 ]