Swift中的设计模式:策略模式
欢迎来到一系列致力于学习设计模式的文章。 尽管许多想法与代码无关,但我们的目标是向您展示如何在Swift中实现它们(在撰写本文时为Swift 3.0)。 每个帖子彼此独立,所有项目代码都可以 在Git上找到 。
策略模式允许您在运行时更改算法的行为。 使用接口,我们能够定义一系列算法,封装每个算法,并使它们可互换,从而允许我们选择在运行时执行哪种算法。
一个例子就是游戏中的角色。 我们的角色-好人-有3种状态:奔跑,步行和站立。 我们希望将状态与其他对象(即Bad Guy角色)一起重用,因此我们希望封装它们,并能够将状态与其他对象一起使用,从而减少了代码量。
我们可以使用UML图显示Good Guy角色如何工作:
首先,在Xcode中创建一个新项目。 我们不会在UIKit中碰任何东西,因此创建一个macOS Terminal项目。
首先,我们需要定义接口/协议(这是同一件事,但是Swift使用单词protocol)。 我们的基本接口定义了一种称为enterState()的方法。 它看起来像这样:
我们可以建立Good Guy类。 此类被设置为接收我们的状态并在我们传递给它的类中执行enterState()方法。 它看起来像这样:
然后我们可以建立我们的状态类。 我们将创建步行,跑步和站立状态。 这个想法是,好家伙将使用这些特征,但坏家伙也将能够在实现时通过实现CharacterState接口来使用它们。 它们非常基础,仅运行打印命令来表明我们已进入该状态。 这是我们各州的实现:
现在,在您的主类中,我们希望能够使用内置在其中的setState函数将状态传递给您的好家伙。 它看起来像这样:
我们将不同的状态传递给我们的Good Guy类,它将执行每个不同的(尽管是基本的)算法。
点击运行,您的输出将如下所示:
进入步行状态
进入站立状态
进入运行状态
程序以退出代码结束:0
欢呼! 您已经实现了策略模式。
奖励-坏家伙
因此,如上所述,“坏人”还可以利用“好人”的功能,而不必重复任何代码(“策略”模式的一大好处)。
创建一个名为BadGuy.swift的新类。 该类看起来与Good Guy类似,但您可以向其中添加特定的Bad Guy功能(例如杀死或射击)。 坏家伙看起来像这样:
为了说明它是如何工作的,在我们的主类中,我们将创建一个Bad Guy对象,并设置状态,就像我们对Good Guy所做的一样,因此现在看起来像这样:
运行它,您将得到以下结果:
进入步行状态
进入站立状态
进入运行状态
进入步行状态
进入站立状态
进入运行状态
程序以退出代码结束:0
现在,您有一个Bad Guy和一个Good Guy共享相同的代码,而不必为每个对象重复该代码。 真好! 与往常一样,您可以在此处找到完整的代码。
山姆·斯通(@ Stonesam92)| 推特
Sam Stone(@ Stonesam92)的最新推文。 移动开发人员和嘻哈迷。 #iosdev #swiftlang #objC。 曼彻斯特… twitter.com