4

为了理解这个问题,您需要了解以下内容:

  1. 我想将一个名为 SCL 的类连接到一个名为 Region 的类。
  2. 现在我有很多不同的方式来连接这两个类的实例。
  3. 写这是Java
  4. 没有使用全局变量

所以我可以创建几个利用多态性的类(大约 9 个),但是每个类只有一个名为 connect(...) 的方法,其中包含许多不同的参数列表。我认为这被称为函子类。

例如一个类“SCLToRegionOverlapCircleConnect”将有一个连接方法,看起来像

public void connect(SCL scl, Region region, int radius, int overlapPercentage) {...} 

而“RegionToRegionNonOverlapSquareConnect”类将有一个看起来像的连接方法

public void connect(Region bottomRegion, Region topRegion, int sideLength) {...}

或者

我可以只创建一个名为 ConnectionTypes 的类,并且只有 9 个不同的方法,每个方法都有不同的方法签名。

每个实现的优点和缺点是什么?谢谢!

4

3 回答 3

0

如果您使用多态性,那么您将在实例化 SCL 对象时确定连接方法。那有意义吗?或者 SCL 类是否可以在其生命周期中以各种不同的方式连接到区域?在这种情况下,多态性没有意义。我们没有任何信息的一个重要方面是connect(...)方法的参数会发生什么。它们是否需要存储在 SCL 类中,在这种情况下,具有不同参数的多态性可能再次有意义,以便每个类都可以存储适当的参数。

另一个想法是,将 SCL 类连接到区域的行为真的是 SCL 类的一种方法,还是应该存在于其他地方?

于 2013-05-27T19:25:49.213 回答
0

我建议你使用第二个。

  1. 更少的类,所以项目比其他方式更清晰。
  2. 当您想在另一个项目(例如)中使用您的方法时,您不需要移动 9 个类,而只需要移动一个类。
  3. 编程时,一条规则是不要重复代码;使用 9 个类,您必须编写 9 次声明,并且可能要声明 9 次相同的全局变量,使用的内存比使用一个多得多。
  4. 重载,这意味着如果您必须以多种方式制作一件事(例如,您必须打印一些对象,结果将是一个字符串,但您需要为一种类型的对象编写不同的内容,等等,您可以使用这种技术)您可以编写 9 个具有相同名称、相同输出但不同输入的方法。
  5. 继承:如果你想创建一个继承这些方法的类,你必须只使用一个类,因为java不支持多重继承。

我看不到任何 CON,除了您必须重新初始化全局变量以避免出现问题。

于 2013-05-27T19:29:46.187 回答
0

让我直说两点:

  • 您正在考虑 Command 模式,而不是 Functor 模式。不同的是后者也有获取返回值的方法,但是你的connect方法是无效的。
  • Functor 模式不会对您的每个connect方法都有不同的签名;相反,每个具体的类都有专门的参数设置器(特定于您想要连接的特定方式)和相同的无参数public void connect()方法。后者将是在公共Connect超类型中声明的唯一方法。

如果您愿意,我可以提供一些示例代码。

优点:如果在代码中的任何地方都可以使用 Connect 命令,而无需知道您正在处理的 9 种方式中的哪一种,那么命令模式就是您的朋友。

缺点:您将拥有更多代码,并且封装纯功能会大大降低代码的可理解性。

于 2013-05-27T19:56:41.810 回答