Java 使用varags将许多类似的函数概括为一个

Java 使用varags将许多类似的函数概括为一个,java,design-patterns,variadic-functions,Java,Design Patterns,Variadic Functions,背景: 我目前有一个工作的java应用程序,它使用WorldWind在世界地图上显示各种类型的数据。数据通过RPC来自不同的客户端。每个调用都绑定到一个数据类型中,并具有如下各种参数: public synchronised ObjectID draw2DCircle(UUID userID, Position centre, Double radius){...} public synchronised ObjectID draw2DRectangle(UUID userID, Positio

背景:

我目前有一个工作的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接口

绘图函数的操作流程如下所示:

  • 检查函数参数
  • 创建MapObject
  • 将MapObject添加到贴图层(允许WorldWind在其上调用渲染)
  • 更新包含MapObjects列表以及MapObjects所有者的内部map
  • 将MapObject的ID返回给调用者
  • 更新函数的操作流程如下所示:

  • 检查函数参数
  • 检查调用方是否拥有这些对象
  • 创建将运行MapObjects Updatexx方法的新可调用对象
  • 将callable传递给FutureTask,然后将其发送到EDT
  • 等待通过get()返回并将其返回给调用方
  • 问题:

    通常我不会太在意这个的设置,但是有大约50种不同的形状可以放在地图上。这意味着50个不同的drawXXX方法和50个updateXXX方法,每个方法都有不同的参数,但下面的代码非常相似。我有一个相当大的文件,其中包含大量重复的代码,这对于可维护性来说并不是很好

    我的想法:

    我需要保留不同的shape类型类,因此仍然需要为每个类使用不同的构造函数,但我认为我可以概括更新调用。如果我删除特定的update2DCircle、Update2dRecTable等。。。。在shape类中,替换为一个简单的更新(从基本IMAPOObject接口)并使用varags,我应该能够将所有RPC更新调用汇集到一个方法中,如下所示:

    update2DCircle(Args){return shape.updateShape(Args);}
    update2DRectangle(Args){return shape.updateShape(Args);}
    
    每个形状都有实现:

    private boolean updateShape(Object ...){}
    
    我知道我正在失去对varags的类型检查,但是类型检查是在进行调用的RPC实现上完成的

    我的另一个想法是不更新形状,而是在每次调用draw/update方法时创建一个新的形状,但这稍微复杂一些,因为形状可能会从内部WorldWind方法(在EDT上)更改,RPC方法发生在不同的线程上,所以我需要某种形状锁定

    问题:

    根据我所解释的,我提出的任何解决方案看起来都是正确的方法,还是我现有的设置还可以?有没有更好的解决方案使用一些我没有想到的设计模式


    我试图尽可能多地将此作为一个编程问题(与意见相反),以满足SO规则,尽管我确实理解它的含义,但这不是我的意图:)

    我相信该模式是您应该使用的模式

    模板模式是我在原始问题中提到的解决方案(IMapObject接口,带有一个由形状实现的通用更新方法)。我猜它有两个投票权;我的和你的;)