Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java抽象类或静态实用程序类设计选择_Java_Design Patterns_Oop - Fatal编程技术网

Java抽象类或静态实用程序类设计选择

Java抽象类或静态实用程序类设计选择,java,design-patterns,oop,Java,Design Patterns,Oop,我正在实施一些策略,这些策略有一些共同的行为,并且还没有决定共同的操作应该在哪里 假设1个上下文和3个策略,策略中使用的一些操作是共享的,一些只需要2个,其他只是策略中的一个 没有成员级别的状态共享,因此唯一的操作实际上是无状态的 这些操作的目的是支持将状态格式化为文件,如视图帮助器 选项1:创建一个AbstractStrategy类 我正在使用Java,所以这很快 在 未来 遗传倾向于结果。 在山脊结构中 行动将是最终决定 选项2:创建静态帮助程序的Util类 灵活,但出于某种原因,

我正在实施一些策略,这些策略有一些共同的行为,并且还没有决定共同的操作应该在哪里

  • 假设1个上下文和3个策略,策略中使用的一些操作是共享的,一些只需要2个,其他只是策略中的一个
  • 没有成员级别的状态共享,因此唯一的操作实际上是无状态的
  • 这些操作的目的是支持将状态格式化为文件,如视图帮助器
选项1:创建一个AbstractStrategy类

  • 我正在使用Java,所以这很快 在 未来
  • 遗传倾向于结果。 在山脊结构中
  • 行动将是最终决定
选项2:创建静态帮助程序的Util类

  • 灵活,但出于某种原因,感觉像是一种代码气味
  • 不起垄
有什么建议或偏好吗


请注意,我所处的级别是策略级别,而不是上下文级别(请参见wikipedia链接)。

实现这一点的方法有很多

  • 使用抽象类并将执行的可变部分转换为抽象方法 =>一些策略可以实现所有操作(通过覆盖抽象方法),而其他策略可以跳过可选的操作。 注意,在这种情况下,可选操作可以是空钩子方法,而不是抽象方法。这样可以避免将这些操作作为子类中的空方法实现的麻烦

  • 使用一个实际的“策略”接口(使用类似于您所指的维基百科文章中的execute方法)。然后,客户机类将由策略的实现提供(可以是匿名内部类或实际的完整策略类)

  • 第一个更简单但更严格:如果必须修改操作的数量(特别是抽象操作),则必须更新所有子类


    第二种方法更灵活,但您必须找到一种方法,通过授权或使用静态实用方法在不同策略之间“共享”常见操作。

    除了您列出的两种方法之外,还有另一种选择:

    在我听来,你想要一种你只需要用到你所需要的功能的合成。也许您可以使用命令模式打包您的操作,然后从中组合策略

    优势:

    • 不需要策略继承
    • 策略对未使用/隐藏的“共享方法”不具有可见性
    • 没有包含大量(可能)不相关方法的静态实用程序类
    • 单元测试更简单-可以单独测试操作
    • 迭代操作的简单共享策略类
    缺点:

    • 额外的课程
    • 操作必须符合通用命令界面,该界面可能具有限制性
    • 对于非常简单的操作来说,这可能是一种过火的操作——您的格式化程序可能就是这样

      • 有一个原因。。。一个巨大的原因。。。在抽象类或接口上使用静态Util类

        因此,您可以在以后添加更多方法

        对于抽象类或接口,您对该类/接口所做的任何更改都必须在从其继承的所有类中进行更改。如果您正在编写一个公共API,那么这个问题尤其严重


        Java框架中有分散着静态方法的util类。最著名的是在包中:和。

        如果它被声明为抽象的,人们可能会猜测它是为扩展而设计的。
        因此,声明一个私有构造函数是一个更好的主意。

        “第二个更灵活,但您必须找到一种方法,通过授权或使用静态实用程序方法在不同的策略之间“共享”公共操作。”--策略是我工作的级别和“公共部分”正如你所说,这是我试图解决的问题。公共部分是否适合小型业务单位?我的意思是:它们可以被建模为函数吗?如果是这样,我建议将这些操作封装在小的“操作”类中,并重用这些accross策略。在这种情况下,优点是可测试性和可重用性。小单元是的,但不是跨业务的。仅适用于策略-因此我认为静态util包受限,如果您只需要无状态逻辑,那么包受限静态方法与对象一样好。你失去了多态性(以及OO纯粹主义者的喜爱和支持;-),但它仍然是可测试和可重用的。这一点很好。我个人认为静态是最好的选择。这些函数非常适合ViewHelper模式,因此过于复杂化似乎是不必要的这两个都是使用静态实用程序类的好例子。@Powerlord我很好奇您今天是否会坚持这个答案?策略与本例中的命令非常相似,因此我不知道如何避免继承,因为如果我理解正确,这些命令仍然需要在它们之间共享公共函数,您建议如何实现这一点?我建议策略由命令组成。每个“函数”都是一个命令实例。然后,你可以简单地通过选择合适的命令来组合你的策略。当需要遵循开-关模式时,我更喜欢使用抽象,即程序将打开进行扩展,但关闭进行修改。。。