在此,我们对前面的图表组件进行扩展。这里我们用到了一个设计模式:Observer模式。使用Observer模式可使一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。所以在Observer中,关键的对象是被观察目标和观察者。一个观察目标可以有多个观察者。观察者必须事先注册给观察目录。这样当观察目录的状态发生改变时,观察者才有可能被通知到。
sts北方站长站 在我们的实时绘图结构中,DataSeries就是被观察目标,而Chart就是观察者。为此,我们设计了一个DataChangeListener接口作为观察者。我们重载了一个Chart来实现DataChangeListener。相应的,我们也重载了DataSeries类,提供注册观察者的机制。下面是它们的结构:
sts北方站长站
sts北方站长站 RealtimeChart对象事先用registerDataChangeListener方法注册给RealtimeDataSeries对象。当RealtimeDataSeries的数据发生改变时,将调用notifyListener方法通知所有已注册的DataChangeListener。Notify方法将依次调用每个已注册DataChangeListener对象的dataChanged方法。如下图:
sts北方站长站
sts北方站长站 在RealtimeChart中,实现了DataChangeListener接口的dataChanged方法:
sts北方站长站public class RealtimeChart extends Chart implements DataChangeListenersts北方站长站 { sts北方站长站 …… sts北方站长站 /*实现DataChangeListener的方法*/ sts北方站长站 public void dataChanged() sts北方站长站 { repaint(); sts北方站长站 }sts北方站长站 } |
sts北方站长站 RealtimeChart的dataChanged方法在这里只需简单的重新绘制一次自己。绘制时将自动按新的数据来绘制。利用Observer模式,实时绘图就这样子简单的实现了。
sts北方站长站 借助实时绘图的例子,读者可以很容易的自行写一个连接到
数据库或者说网络流的绘图
程序,在此,我们就不作讲解了。
sts北方站长站 结束语sts北方站长站 本文已较完整的讲解了一个可扩展的图表组件的构建过程。读者可以在此基础上扩展自己的组件。例如扩展LinePlot,使它具有可改变线型,线宽,还有点样式等功能。或扩展BarPlot,使它可以用不同的填充模式。你甚至可以扩展Axis来实现3D模式的图表。
sts北方站长站
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面