单击时对象的设计模式表现不同,具体取决于全局状态

时间:2010-04-23 11:24:45

标签: design-patterns

我正在使用Unity3D来解决这个问题,但这是一个通用的软件工程问题。

Unity3D中的实体(交互式对象)是使用组件或行为构建的。通过将行为放在一起,您可以定义对象的确切行为。

我正在思考如何在点击全局状态时让不同的对象做出不同的反应。例如,我有一个工具,目标只影响场景中的圆圈;如果我选择该工具,然后单击一个对象,如果它是一个圆,我会将其更改为正方形。如果它不是一个圆圈,我会忽略它。

使用基于组件的实体设计,我将定义一个名为IsCircle的行为,当它被点击时,我将检查是否应该发生什么。但是,它访问整个应用程序的全局状态的最佳方式是什么?假设我希望避免任何切换,if-else并希望解决方案解耦

(问题是OnMouseDown()事件处理程序没有传入任何参数)。

如果答案记住我正在使用的环境强制执行复合模式,我将不胜感激。

3 个答案:

答案 0 :(得分:2)

我不确定您是否可以使用此解决方案,但请查看状态设计模式我用于根据其状态更改对象的行为,因此在您的示例中,您必须将状态移动到对象。您还可以考虑访客设计模式,也许还有某种多方法。

答案 1 :(得分:0)

也许您可以创建查找表Dictionary<int, Func<int, TAction>>,并在创建对象时添加适合该对象的操作。这样您就可以避免使用开关而不必修改对象。

如果你想要管理自己的状态,那么AutoFac的创建者Nicholas Blumhardt就会有一个名为stateless的状态机实现。我的answer to this SO question在这里描述了详细信息。

答案 2 :(得分:-1)

也许与Observer类似的东西可以提供帮助吗?需要根据全局状态更改其行为的所有组件都注册到ScreenManager之类的对象,并且每当全局状态发生更改时,您都会通知在更改时刻注册的所有组件,并相应地更改其状态。