Swift中的设计模式:第二部分-行为设计模式

在该系列的第一篇文章中,我讨论了创意设计模式。
现在,我将描述另一组称为行为设计模式的模式。

行为设计模式处理对象之间的交互方式。 它描述了对象之间如何进行通信,以及如何在不同对象之间破坏任务的步骤,从而提供了更大的灵活性并使得代码更具可测试性。

让我们跳到以下10个行为设计模式:

1.责任链

责任链是一种行为设计模式,可让我们在一系列处理程序之间传递请求,其中每个处理程序都决定处理请求或将请求沿着处理链传递。

有一个名为“ 级别”的枚举将“体育”管理细分为三个级别:州,国家和国际。 首先,让我们创建一个名为Sports的类,它将仅保留当前的体育管理水平。

然后,我们有了称为GameManagement的协议,该协议可以沿处理程序链传递责任。 StateSportsTeamNationalSportsTeamInternationalSportsTeam类实现了此协议。 如果运动级别不属于他们的管理层,他们会将责任转移给更高的管理层(或管理人员链)。

在操场上运行代码:

   stateSportsTeam = StateSportsTeam() 
nationalSportsTeam = NationalSportsTeam()
internationalSportsTeam = InternationalSportsTeam()
  stateSportsTeam.nextLevelManagement =国家运动队 
nationalSportsTeam.nextLevelManagement = internationalSportsTeam
  let sports1 =体育(级别:Level.international) 
stateSportsTeam.manage(sports:sports1)
  let sports2 =体育(级别:国家级) 
stateSportsTeam.manage(sports:sports2)
  let sports3 =体育(等级:Level.state)stateSportsTeam.manage(体育:sports3) 
  输出: 
由国际体育管理公司管理
由国家体育总局管理
由国家体育总局管理

2. 命令模式

在命令模式中,将执行命令的类(称为Invoker )与产生命令的类( ConcreteCommand )和知道如何执行该命令的类( Receiver )分离。

让我们遵循以下示例。
祈求者 是模式的心脏。 它 可以打电话给 execute()方法在不知道具体类ConcreteCommand及其作用的情况下执行操作。 它只知道抽象类型Command 协议。

具体命令 类符合Command协议,并在初始化器中接受Receiver对象的实例。 然后,它调用接收方对象以执行某些任务/操作。

接收者 是实际工作的课程。 它可以是任何业务逻辑,数据库请求或网络操作。
客户端是创建ConcreteCommand对象并将其传递给调用程序的类。 它可以是您的视图控制器类。

试用代码:

   client = Client() 
client.showPattern()
  输出: 
红色

3.迭代器模式

此模式用于迭代元素集合。 它没有公开用于实现它的数据结构(数组,字典或链表),而是提供了一个在元素集合上进行迭代而又不暴露其底层表示的接口。

有没有想过for-in循环在Swift中如何工作?
Swift具有内置的Sequence协议,可帮助创建迭代器。 序列协议通过创建迭代器来对其元素进行顺序访问。 IteratorProtocol是一种类型,一次提供一个序列的值。

MyBestFilms类实现了创建自定义迭代器的Se​​quence协议。 每次调用next()函数时,它将返回下一个元素并存储当前索引。
太棒了! 您可以创建自己的自定义序列。

说明要点:

  let myFilms = MyBestFilms(电影:[“教父三部曲”,“沉默的羔羊”,“以你的名字呼唤我”)) 
  用于 myFilms中的电影{ 
印刷(胶卷)
}
  输出: 
教父三部曲
沉默的羔羊
用你的名字叫我

4.中介者模式

让我们假设一个场景,即两个或多个类必须相互交互。 他们可以通过调解器进行交谈,而不是直接相互交流并了解其实现知识。

因此,例如,有两支球队互相竞争以在比赛的决赛中被选中。 A队是复仇者联盟 ,B队是非凡绅士联盟。
因此,它们无需直接彼此通信,而是注册到调解器对象,然后可以通过调解器彼此发送消息。

定义了两个协议:
协议接收器 由小组实施,该小组具有将消息作为参数的抽象接收方法。

协议发送者 由具有抽象方法send的Mediator实现,该方法使用message和Receiver类型的对象作为参数。
我们的调解员遍历其团队列表中的每个团队。 如果团队A正在发送请求,则团队B将收到请求,反之亦然。

请注意,团队之间并不相互了解。 没有引用B团队中的A团队和A团队中的B团队。

注意:NSNotificationCenter使用调解器模式

让我们尝试一下。

  中介= Mediator() 
teamA = TeamA(名称:“复仇者联盟”)
teamB = TeamB(名称:“非凡绅士联盟”)
  mediator.register(候选人:teamA) 
mediator.register(候选人:teamB)
  mediator.send(消息:“已选择最终版本!来自\(teamA.name)”,发送者:teamA) 
mediator.send(消息:“未选择来自\(teamB.name)的最终结果!”,发送者:teamB)
  输出: 
非凡绅士联盟获得:入围决赛! 来自《复仇者联盟》
  复仇者联盟:未入围决赛!  来自非凡绅士联盟 

5.纪念图案

Memento Pattern捕获对象的当前状态并以某种方式存储它,以便您以后想要返回到先前状态时可以检索它。

我们有一个协议备忘录 使用保存的默认实现 检索 方法。
保存 使用UserDefaults中的键保存“ state”属性。
找回 使用UserDefaults中的键恢复`state`属性。
是字典类型,它用唯一键存储值
用于从状态中检索相应的值

Class Profile将实现Memento协议。 通过实现此协议,我们可以将整个类保存到持久性存储中,然后在以后获取状态。

在操场上尝试:

  var profile = Profile(名称:“ Nick Jonas”,年龄:36岁,关键:“ NickProfile”) 
profile.saveDetails()
 个人资料=个人资料(名称:“ Priyanka Chopra”,年龄:26岁,关键字:“ PriyankaProfile”) 
profile.saveDetails()
  let profile1Details =配置文件(键:“ PriyankaProfile”) 
profileState = profile1Details.retrieveDetails()
打印(profileState)
  输出: 
[“年龄”:26,“名称”:Priyanka Chopra]

6.观察者模式

在这种模式下,一个对象将其状态更改通知其他对象,即,当一个对象的状态更改时,订阅该对象的另一对象将收到有关状态更改的通知。

因此,这是一对多的关系。 状态发生变化的对象称为可观察的主题,遵守 可观察的变化的对象称为观察者

Observable协议具有三种抽象方法:
add :用于添加观察者
删除 用于删除观察者
notify 用于通知所有观察者其状态更改

假设有一种情况,即Apple卖家必须通知她的顾客有关到达她商店的新苹果的信息。 新苹果一到,她就会通知添加到循环中的新苹果客户。 她还可以从循环中删除客户。

AppleSeller是实现Observable的类 协议。 当appleCount变量值更改时,它将调用notify()方法来通知添加到其中的客户。
客户是一个侦听appleCount变量中的更改的 。 一旦此变量的值更改,客户就会通过update()获得更新 方法。

这是用法:

   appleSeller = AppleSeller() 
  let james = Customer(名称:“ James”,可观察:appleSeller,customerId:101) 
let david = Customer(名称:“ David”,可观察:appleSeller,customerId:102)
  appleSeller.appleCount = 10 
appleSeller.remove(客户:james)
appleSeller.appleCount = 20
  输出: 
快点詹姆斯! 10个苹果到了商店。
快点大卫! 10个苹果到了商店。
快点大卫! 20个苹果到了商店。

7.状态模式

状态设计模式是一种对象内部状态发生变化时需要更改其行为的设计模式。 看起来好像对象已更改其类。

首先,我们定义一个名为Human的协议,该协议具有用于获取当前状态的吸气剂和用于设置对象当前状态的setter器。
国家将由一个名为Man的阶级承担。
协议ManState具有三个状态: stand() 步行() run() 。 它由三个具体的类实现: StandingStateWalkingStateRunningState

为了说明此模式的要点:

   man = Man() 
   walkingState = WalkingState(人) 
WalkingState.walk()
打印(man.getState()。toString())
   runningState = RunningState(man) 
runningState.run()
打印(man.getState()。toString())
  输出: 
该人处于步行位置
行走状态
该人处于跑步位置
运行状态

从结果中可以看到,在类的相同实例上调用相同的方法会产生不同的结果。

8.策略模式

这种模式定义了一系列算法,每个算法都编写在一个单独的类中,使我们可以选择在运行时执行哪种算法。

我们定义了一个名为Strategy的协议,它有一个名为convert的方法,可以将数字转换为用户在运行时决定的格式。
我们实现两种算法: BinaryStrategy 将数字转换为二进制和HexStrategy 将数字转换为十六进制。

Convert类具有称为Strategy的属性,因此可以使用实现Strategy协议的任何类。
在运行时,根据我们选择进行二进制数字转换的算法还是选择进行十六进制数字转换的算法,传递策略类型的类实例。

运行上面的代码:

   binaryConvert = Convert(数字:2,策略:BinaryStrategy()) 
binaryConvert.update()
   hexConvert = Convert(数字:123,策略:HexStrategy()) 
hexConvert.update()
  输出: 
二进制是10
十六进制是7b

9.模板模式

在这种模式下,基类定义算法的模板,并让子类以与在基类中定义的相同方法来实现这些抽象方法,而无需更改整体结构。

在模板方法模式中,类仅使用实现算法步骤的基类进行交互。 快速地,我们将为此使用接口委托。
假设在办公室中,所有员工都有一个办公室时间表。
协议办公室有一个称为officeSchedule()的抽象方法。 XYZOffice类将实现此协议。

所有员工都有共同的责任,例如工作,并获得报酬。
协议Employee有两种抽象方法: work()getPaid()
不同的员工将从事不同的工作,但他们仍然遵循相同的工作和报酬模板。

说明要点:

   xyzOfficeDev = XYZOffice(员工:Developer()) 
xyzOfficeManager = XYZOffice(员工:ProductManager())
  xyzOfficeDev.officeSchedule() 
xyzOfficeManager.officeSchedule()
  输出: 
开发人员本月每周工作40个小时
开发人员本月已赚取50,000卢比
产品经理本月每周工作55小时
产品经理本月的收入为80,000卢比

10. 访客模式

访客设计模式将算法与对其进行操作的对象分离,即,将操作逻辑从组中的每个元素移到新类中。 新类将使用这些元素中的数据执行操作逻辑。

每个元素都接受一个访问者,该访问者在另一个类中执行逻辑。 因此,访问类的结构完全不变。
每个国家都应该能够接受访客。 因此,我们声明了一个名为Country的协议,该协议具有一种接受访客的方法。
访客名为CountryVisitor
让我们为国家定义具体的类。

现在,让我们实现CountryVisitor协议并展示这种设计模式。

在操场上跑步

  允许国家/地区:[国家/地区] = [印度(),巴西(),中国()] 
let名称= country.map {(国家/地区:国家->字符串输入
访问者= CountryVisitorName()
country.accept(访客:访客)
返回 visitor.visitorName
}
打印(名称)
  输出: 
[“ Chen”,“ Ramesh”,“ Antonio”]

这是操场文件的链接。

本文通过工作示例全面介绍了Swift中的所有行为设计模式。

行为设计模式侧重于对象的通信和交互,强大的动态接口和对象组成,这些都应用于设计软件。