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_Composition - Fatal编程技术网

使用组合(java)时如何实现关闭开关?

使用组合(java)时如何实现关闭开关?,java,design-patterns,composition,Java,Design Patterns,Composition,我在java中有一个非常简单的Player类,它使用了一些从接口PlayerStrategy继承的策略对象 PlayerStrategy的一些实现非常简单,但其他一些实现非常占用资源,因此我需要确保在停止使用该策略时正确释放资源。这些策略还有一个额外的方法:turnOff()来解决这个问题 现在,如果玩家离开游戏,我希望它在所有需要它的策略中调用turnOff() 问题是,只有少数策略需要关闭(),因此我不愿意将该方法添加到PlayerStrategy接口 现在,当玩家停止游戏时,它会通过反射检

我在java中有一个非常简单的Player类,它使用了一些从接口PlayerStrategy继承的策略对象

PlayerStrategy的一些实现非常简单,但其他一些实现非常占用资源,因此我需要确保在停止使用该策略时正确释放资源。这些策略还有一个额外的方法:turnOff()来解决这个问题

现在,如果玩家离开游戏,我希望它在所有需要它的策略中调用turnOff()

问题是,只有少数策略需要关闭(),因此我不愿意将该方法添加到PlayerStrategy接口
现在,当玩家停止游戏时,它会通过反射检查其策略中是否存在方法turnOff()。但它又笨重又难看。有更好的办法吗

  • 避免反射:反射是个坏主意。无论你在哪里(看起来你也可以),都要避免它

  • 最好在界面中设置
    关闭()
    如果必须使用界面。。。相信我,添加
    turnOff()
    cleanup()
    方法是个好主意;即使大多数子类只有空的花括号。如果将来它们被更新以使用一些需要清理的资源,您就不需要做额外的工作

  • 你可以得到你想要的,但代价更高:如果你真的很死板,并且确信子类不会扩展任何其他类。您可以将
    PlayerStrategy
    作为一个抽象类,并将
    turnOff()
    作为空方法。这将解决这两个问题,但会限制子类扩展其他类的能力


  • 如果您不想更改PlayerStrategy的实现,您可以使用来处理关闭。

    我更喜欢实现了大多数方法的非抽象类。这样一来,大多数策略都会很简单,重的策略可能会超过其他方法。这是我通常做的,但我有一些实现多个接口的实现,这就是为什么我目前处于困境的原因。那么我的门面是否应该关闭?@carrnight你的门面将关闭。谢谢。我想它只是更容易添加到接口。纯洁是该死的。