我正在使用Unity3D来解决这个问题,但这是一个通用的软件工程问题。
Unity3D中的实体(交互式对象)是使用组件或行为构建的。通过将行为放在一起,您可以定义对象的确切行为。
我正在思考如何在点击全局状态时让不同的对象做出不同的反应。例如,我有一个工具,目标只影响场景中的圆圈;如果我选择该工具,然后单击一个对象,如果它是一个圆,我会将其更改为正方形。如果它不是一个圆圈,我会忽略它。
使用基于组件的实体设计,我将定义一个名为IsCircle的行为,当它被点击时,我将检查是否应该发生什么。但是,它访问整个应用程序的全局状态的最佳方式是什么?假设我希望避免任何切换,if-else并希望解决方案解耦
(问题是OnMouseDown()事件处理程序没有传入任何参数)。
如果答案记住我正在使用的环境强制执行复合模式,我将不胜感激。
答案 0 :(得分:2)
我不确定您是否可以使用此解决方案,但请查看状态设计模式我用于根据其状态更改对象的行为,因此在您的示例中,您必须将状态移动到对象。您还可以考虑访客设计模式,也许还有某种多方法。
答案 1 :(得分:0)
也许您可以创建查找表Dictionary<int, Func<int, TAction>>
,并在创建对象时添加适合该对象的操作。这样您就可以避免使用开关而不必修改对象。
如果你想要管理自己的状态,那么AutoFac的创建者Nicholas Blumhardt就会有一个名为stateless的状态机实现。我的answer to this SO question在这里描述了详细信息。
答案 2 :(得分:-1)
也许与Observer类似的东西可以提供帮助吗?需要根据全局状态更改其行为的所有组件都注册到ScreenManager
之类的对象,并且每当全局状态发生更改时,您都会通知在更改时刻注册的所有组件,并相应地更改其状态。