[老码团队]Swift中的协议 - 用协议来实现委托模式
来源:互联网 发布:360mac版在哪下载 编辑:程序博客网 时间:2024/06/06 00:10
委托是一种设计模式,它允许类
或结构体
将一些需要它们负责的功能交由
(委托)
给其他的类型的实例。在这种设计模式中,会涉及到几个角色:
公共接口(Interface):负责封装起需要被委托的功能
代理者(Delegate):被委托者,通过它来调用被委托的功能
委托者(mandator):将他们负责的功能委托给其他的类或结构体,即被委托者
一个码农成长的过程中,如果要保证写出的代码是灵活的,可复用的,健壮的,那设计模式是必须掌握的基本技能,同时,这也有可能是企业考察应聘者能力的考察点之一。虽然在GOF的书中,delegation并没有单独里描述为一种设计模式,但委托模式却是最广泛的使用在软件设计当中,同时,它还是其他设计模式,比如state模式,strategy模式必不可少的组成部分。在C++中,我们把公共接口封装到类,然后通过继承来实现功能委托;在C#和JAVA中,我们可以更方便的通过实现公共接口(interface)来实现;而在Swift中,我们则通过协议来实现委托模式,协议将承担公共接口的角色,把需要被委托的函数和方法封装起来
,然后要求遵循者
拥有这些被委托的函数和方法
。
具体的使用方法,老码还是通过例子来介绍:
看过冰与火之歌的朋友都知道,在那个魔幻的世界中有一个种人叫做易形者(skinchanger),他们可以让灵魂进入其他动物甚至是其他人的身体里面,从而控制他们的身体获得他们的能力:
- @objc protocolskinChangerDelegate
{
- var skinType:String
- func
Spy()
- optional func
Investigate()
- optional attack()
- }
这里,我们就定义了这样的一个协议,它把易形者可以从动物那获得的能力,或者说动物们可以委托给易形者的能力封装了起来。当然,这种能力应该是多样的,通过动物的眼睛获得视野,通过动物的活动区域探索地形,甚至可以通过动物的狩猎或防御技能进行攻击。我们把他们分别封装到skinChangerDelegate中,当然,因为动物的身体相对于拿钢剑,穿盔甲的骑士来说是脆弱的,所以野人军队更看重的是侦查的能力,而非战斗力上的输出,所以对易形者来说利用动物的能力来侦查是必须的,其他能力则是可选的,正如代码中Spy()是必要需求,
而func Investigate()和func attack()是可选需求一样,关于可选,老码会在后头的章节再做详细的介绍。
现在,构造一支野人军队,易形者是组成的一部分,
- classWildArmy:
{
- var
warrior:Int =
1000- var
giant:Int =
25- var
mammoth:Int =
10- var
animalDelegate:
skinChangerDelegate?func
spyByAnimal() {
- animalDelegate?.spy()
- }
- func
attack() {
- //具体实现
- }
- }
多种类型动物是可以被控制的:
- classEagleSkin: skinChangerDelegate
{
var
name:String = “鹰”
- func
spy() {
println(“
翱翔于天际,侦查敌情”)
- }
- }
- classWolfSkin: skinChangerDelegate
{
var
name:String = “狼”
- func
spy() {
println(“
穿行于黑夜,侦查敌情”)
- }
- }
这支军队由曼斯率领,军中有多种动物,通过易形者作为代理,可为野人军队所用:
- let
armyOfMance =
WildArmy()
- let
animals :[
SkinChanger] = [
EagleSkin(),WolfChanger()]
- for animal in animals{
- armyOfMance. animalDelegate = animal
- armyOfMance. spyByAnimal()
- }
- //翱翔于天际,侦查敌情
- //穿行于黑夜,侦查敌情
- [老码团队]Swift中的协议 - 用协议来实现委托模式
- OC_协议实现代理委托模式
- swift详解之十一------------协议、委托(代理)模式
- OC中的以协议实现的委托
- 利用协议实现委托
- 用lua来验证modbus协议中的ascii传输模式中的1363协议数据是否正确
- swift中的协议
- Swift语言中的协议
- Swift中的协议
- Swift 中的协议 (Protocol)
- Objective-C中的协议和代理(委托)设计模式
- iOS中的协议与委托
- iOS中的协议与委托
- IOS中的委托和协议
- iOS中的协议与委托
- iOS中的协议与委托
- 自定义协议或实现委托
- Swift中的协议-(协议基础-3.0)
- org.xml.sax.SAXParseException: Content is not allowed in prolog.
- C# 连接Oracle方法
- expdp ora-31640 ora-19505
- 用eclipse memory analyzer分析heapdump
- java.lang.IllegalArgumentException,parameter must be a descendant of this view
- [老码团队]Swift中的协议 - 用协议来实现委托模式
- 基于Node.js平台mongoDB开发——mongoskin(by vczero)
- JNDI是什么
- 黑马入学_学习blog_第八篇
- php $_file中error错误解释
- 是什么引起执行计划变得极其糟糕? 应该使用更新统计信息来解决它吗?
- 【HDU】3016 Man Down 线段树DP
- 我所理解的谷歌云计算
- 要想提高工作效率,请拒绝做这7种事