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

时间:2014-05-30 09:19:11

标签: java design-patterns variadic-functions

背景

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

绘制函数的操作流程如下:

  1. 检查函数参数。
  2. 创建MapObject。
  3. 将MapObject添加到地图图层(允许WorldWind在其上调用渲染)。
  4. 更新包含MapObjects列表及拥有者的列表的内部地图。
  5. 将MapObject的ID返回给调用者。
  6. 更新功能的操作流程如下:

    1. 检查函数参数。
    2. 检查来电者是否拥有这些物品。
    3. 创建将运行MapObjects updateXXX方法的新 Callable
    4. 将callable传递给 FutureTask ,然后将其发送到EDT。
    5. 通过 get()等待返回并将其返回给调用者。
    6. 问题:

      通常我不太关心这个的设置但是有大约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规则,尽管我理解它是如何阅读但这不是我的意图:)

1 个答案:

答案 0 :(得分:0)

我相信Template method模式是你应该使用的模式