1700469116
1700469117
//通知李斯
1700469118
1700469119
this.liSi.update(“韩非子在吃饭”);
1700469120
1700469121
}
1700469122
1700469123
//韩非子开始娱乐了
1700469124
1700469125
public void haveFun(){
1700469126
1700469127
System.out.println(“韩非子:开始娱乐了……”);
1700469128
1700469129
this.liSi.update(“韩非子在娱乐”);
1700469130
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所示。
[
上一页 ]
[ :1.700469116e+09 ]
[
下一页 ]