iOS设计模式-策略模式

策略模式

  • 将一系列的算法单独封装起来,使调用者在使用的时候,可以互相替换。

企鹅案例

  • 这里我们需要几个企鹅,那这几个企鹅都有不同的玩耍方法,可能有不同的吃东西的方法。(如:暴力企鹅一号,它玩耍的方法就是打豆豆,吃东西就是吃小鱼。无聊企鹅二号,它玩耍的方法就是看暴力企鹅打豆豆,吃东西也是吃小鱼)。
  • 那这里怎么做呢,有很多方法来实现。
    • 方案一:直接建立一个暴力企鹅一号的类,一个无聊企鹅二号的类,分别去实现它们的玩耍和吃东西的方法。
    • 方案二:建立一个企鹅父类,父类有玩耍方法和吃东西方法,两个子类暴力企鹅和无聊企鹅,分别去从写父类方法。
    • ……
  • 这里我们看一下,如果我们需求变化了,又出现了软弱的企鹅豆豆,爱健身的企鹅壮壮。他们玩耍方法不同,但是都是吃小鱼。
    • 按方案一的思路,这里又创建两个类,并且每次都要写那个完全相同吃鱼方法,显然很不合理。
    • 按方案二的思路,这里将父类中的吃东西方法实现成吃鱼的方法。那么新建的两个子类就不需要重写吃鱼的方法,看起来还不错。
  • 这时候需求就又来了,我们新的企鹅出生了,他是一个玩耍是健身,吃东西只吃蔬菜的小企鹅,还有爱看暴力企鹅打豆豆的,只吃水果的企鹅,还有一个爱打豆豆,吃蔬菜的企鹅。这时候怎么办。
    • 这时候,肯定有人想,我建立一个企鹅工厂,来一种企鹅我加一种。但是你有没有发现,这些企鹅中,他们吃东西和玩耍是交叉的,有的玩耍方法相同,吃东西不同;有的吃东西方法相同,玩耍方法不同。
  • 这时候来看看我们策略模式怎么处理。

策略模式实现案例

结构
  • 这里我们按上图结构,如果还有新的玩耍方法,或者吃东西方法,都可以去相应的协议中去添加实现类,然后,新建企鹅子类去自由组合玩耍方法和吃东西方法。
  • 这里协议代码比较简单,就不放出来了,看一下企鹅父类中的实现

Penguin.h

#import <Foundation/Foundation.h>
#import "PenguinEatProtocol.h"
#import "PenguinPlayProtocol.h"
@interface Penguin : NSObject
@property (nonatomic, strong)id<PenguinPlayProtocol> playBehavior;
@property(nonatomic, strong)id<PenguinEatProtocol> eatBehavior;

- (void)penguinPlay;
- (void)penguinEat;
@end

Penguin.m

#import "Penguin.h"

@implementation Penguin

- (void)penguinPlay {
    [self.playBehavior play];
}

- (void)penguinEat {
    [self.eatBehavior eat];
}
@end
  • 然后看一下我们具体的子类中如何来用

ViolentPenguin.m

#import "ViolentPenguin.h"
#import "PenguinEatFish.h"
#import "PenguinPlayHitDouDou.h"
@implementation ViolentPenguin
- (instancetype)init {
    if (self = [super init]) {
        self.eatBehavior = [PenguinEatFish new];
        self.playBehavior = [PenguinPlayHitDouDou new];
    }
    return self;
}
@end
  • 客户端调用
    Penguin * violentPenguin = [ViolentPenguin new];
    [violentPenguin penguinPlay];
    [violentPenguin penguinEat];

    Penguin * boringPenguin = [BoringPenguin new];
    [boringPenguin penguinPlay];
    [boringPenguin penguinEat];
  • 这种处理方法优点是 :可以避免一些 switch 或者 if-else 判断,同时也可以在添加新的行为的时候更加清晰,不需要做大量重复的内容,同时也是符合开闭原则的。
Demo地址:https://github.com/ChenBiaoHub/StrategyDemo

因为一般会 swift 都会 OC ,所以这里就只做了一份 OC Demo ,如果真有需要 swift Demo 的,我会根据留言情况决定是否补充一份 swift Demo。谢谢。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 简介 策略模式就是根据不同的程序场景来使用不同的策略,一般用在有if 判断或switch case中,可以避免把不...
    乔克蜀黍阅读 3,184评论 0 2
  • 毛毛豆豆到了昆明以后,说话的本领突飞猛进,刚刚下楼的时候,舅舅说了一句:哎呀,风噶陡(土话意思风这么大)。我怀里的...
    阔月大江阅读 4,824评论 0 0
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,422评论 2 17
  • 你看它啊,初开的向日葵 初生的花瓣嫩的像水 沐浴在阳光下欢腾 每时每刻,目光追逐太阳的脚步 崇敬 羡慕 你看它啊,...
    越寒阅读 3,523评论 4 5
  • 潜行追踪(美国版):逃生类
    一点也不想吃辣阅读 1,409评论 0 0

友情链接更多精彩内容