本题采用观察者模式的设计模式,即某一主题更新了,其他观察者都能收到更新的通知。
时钟这个实验中,DataModel是一个接口,ClockModel是实现这个接口的类。分别相当于观察模式中的主题(subject)接口和具体实现的接口的主题(ConcreteSubject)。而Clock是CircleClock和TextClock的接口,相当于观察者模式中的观察者接口(Observer)和具体的观察者(ConcreteObserver)的对应关系。
上面就是MVC的数据Model部分。对于视图View部分,采用的是BorderLayout布局方式,将TextClock放在BorderLayout.NORTH的方位上,CircleClock放在在BorderLayout.CENTER的方位上。当TextClock对象和CircleClock对象收到ClockModel对象的时间更新通知时,也相应更新自己的时间。其中这部分比较难的就是CircleClock对象圆时钟的绘制。主要思想是:你可以假设已知方位角为A=0.0000,以半径R=距离,(X,Y)是圆心,按照任意角度a来计算坐标。
X=X+sin(A+a)*R
Y=Y+cos(A+a)*R
提示:这儿在代码中”+”不一定是“+”,也可以是“-”,即当圆旋转到一定的角度就是“-”了。
按以上方式可以绘出圆,不过会发现得到的时钟锯齿状比较明显,需要消除锯齿状: setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON)。
对于MVC中控制Control部分,就是为时钟添加线程,timer.schedule(newonetask(), 1000); 每一秒钟就更新一次时间,也就是重新绘制CirclePane和TextPane。
这个实验主要巩固了观察者模式。
结果截图: