iOS 设计模式实现

Posted

技术标签:

【中文标题】iOS 设计模式实现【英文标题】:iOS Design Pattern Implementation 【发布时间】:2015-06-27 20:01:45 【问题描述】:

我在设计模式上苦苦挣扎,希望在将我当前的应用程序从 Objective-C 重写为 Swift 时遵循最佳实践。

我有一个游戏,玩家可以通过解决一定数量的关卡获得额外分数/或特殊奖品。需要达到几个里程碑(例如完成 10 个级别/完成 50 个级别)。我有不同的游戏模式,所以我有几个 Gameplay 类的子类。在每个玩家轮到-checkSolution 之后,会调用该函数来检查玩家是否解决了关卡。如果成功,我会增加玩家的游戏分数并将他送到一个新的水平。在这里,我还调用了 ScoreManager 类的-checkForMilestone 来检查是否已达到任何里程碑。

我不确定是否可以在-checkSolution 中调用-checkForMilestone。或者最好使用块创建回调或使用 KVO 来观察(来自 ScoreManager 类)玩家的分数是否发生了变化,然后做出适当的反应。

【问题讨论】:

【参考方案1】:

我会保持简单。您可以使用 KVO、事件或其他方法,但从您的描述中我看不到任何好处,但会增加代码的复杂性并使事情更难调试。如果您已经在调用 checkSolution() 并且您知道这是唯一会触发里程碑更改的地方,那么您应该将这两个方法紧密结合在一起。另一方面,如果里程碑可以与成功的解决方案脱钩,例如玩家通过小额支付购买它们或添加玩家里程碑的朋友贡献,那么您可以在分数上创建一个可观察的模式或任何触发更新的东西。

【讨论】:

谢谢。我想我应该和观察者一起去。我只是知道将来会将我的视图控制器变成大型视图控制器:)【参考方案2】:

首先,即使考虑到这一点,你也很高兴。决策中涉及的关键概念是“责任范围”和“关注点分离”。

您可以通过以下考虑确定更好的选择:

    哪些事件可以触发达到里程碑? 哪个类负责该操作? 里程碑能否与正在解决的关卡分开实现?

【讨论】:

好吧,回答上面的问题我想说: 1. 对于游戏模式,它是“解决关卡”。对于另一种游戏模式,它是“提供一定数量的正确答案”。因此,2 个稍微不同的 Gameplay 类子类的 2 种不同方法可以触发达到里程碑。 2. Gameplay 子类负责-checkSolution,ScoreManager 类负责计算总分并检查是否达到里程碑。 3. 是的。见答案 1。 我对 SRP 术语很熟悉,反正很难想出最好的解决方案。我不会打扰自己思考这些东西,例如php,但在 ios 中,我看到了很多我可以使用的甜蜜的东西,而不仅仅是在我想要的时候调用另一个类实例的方法 :) 换个角度想,“谁知道可能影响里程碑的变化,他们什么时候知道?”

以上是关于iOS 设计模式实现的主要内容,如果未能解决你的问题,请参考以下文章

iOS设计模式之桥接模式

iOS 代理设计模式

通知模式实现两个textField传值及模态视图——iOS开发

IOS设计模式-观察者模式

iOS移动架构设计

iOS移动架构设计FWZ