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