背景
我目前有一个工作的java应用程序,它使用WorldWind在世界地图上显示各种类型的数据。数据来自各种客户端通过RPC。每个调用都绑定到一个数据类型,并有如下所示的各种参数:
public synchronised ObjectID draw2DCircle(UUID userID, Position centre, Double radius){...}
public synchronised ObjectID draw2DRectangle(UUID userID, Position centre, Double width, Double length){...}
对于每种绘制方法,还有一种更新方法:
public synchronised boolean update2DCircle(UUID userID, ObjectID objID, Position newCentre, Double newRadius).
每个数据类型都有自己的类,因此draw2DCircle有一个MapSurfaceCircle类,draw2DRectangle有一个MapSurfaceRectangle。类型之间有很多共性,我有各种数据类型分组的接口,如2D形状,3D形状等,但所有对象共有的一个接口是具有render,preRender,move等的IMapObject接口。调用。
绘制函数的操作流程如下:
更新功能的操作流程如下:
问题:
通常我不太关心这个的设置但是有大约50种不同类型的形状可以放在地图上。这意味着50种不同的drawXXX方法和50种updateXXX方法,每种方法都有不同的参数,但下面的代码非常相似。我有一个包含大量重复代码的相当大的文件,这对于可维护性来说并不是那么好。
我的想法:
我需要保留不同的形状类型类,所以仍然需要为每个类都有不同的构造函数,但我想我可以概括更新调用。如果我在形状类中删除特定的 update2DCircle , update2DRectagle 等....并替换为简单的更新(来自基础 IMapObject 接口)并使用varags我应该能够将所有RPC更新调用汇集到一个方法中,如下所示:
update2DCircle(Args){return shape.updateShape(Args);}
update2DRectangle(Args){return shape.updateShape(Args);}
每个形状都有实现:
private boolean updateShape(Object ...){}
据我所知,我正在使用varags进行类型检查,但是类型检查是在进行调用的RPC实现上完成的。
我的另一个想法是不更新形状,但每次调用绘制/更新方法时都会创建一个新形状,但由于形状可能会从内部WorldWind方法(在EDT上)发生变化,这稍微复杂一些并且RPC方法发生在不同的线程上,所以我需要某种形状锁定。
问题:
根据我的解释,看起来我提出的任何解决方案都是正确的方法,或者我现有的设置是否合适?使用一些我没有想过的设计模式是否有更好的解决方案?
我试图尽可能多地编写一个编程问题(而不是意见)以满足SO规则,尽管我理解它是如何阅读但这不是我的意图:)