iOS设计模式-策略模式
2018-01-16 本文已影响0人
小_黑_屋
策略模式
- 将一系列的算法单独封装起来,使调用者在使用的时候,可以互相替换。
企鹅案例
- 这里我们需要几个企鹅,那这几个企鹅都有不同的玩耍方法,可能有不同的吃东西的方法。(如:暴力企鹅一号,它玩耍的方法就是打豆豆,吃东西就是吃小鱼。无聊企鹅二号,它玩耍的方法就是看暴力企鹅打豆豆,吃东西也是吃小鱼)。
- 那这里怎么做呢,有很多方法来实现。
- 方案一:直接建立一个暴力企鹅一号的类,一个无聊企鹅二号的类,分别去实现它们的玩耍和吃东西的方法。
- 方案二:建立一个企鹅父类,父类有玩耍方法和吃东西方法,两个子类暴力企鹅和无聊企鹅,分别去从写父类方法。
- ……
- 这里我们看一下,如果我们需求变化了,又出现了软弱的企鹅豆豆,爱健身的企鹅壮壮。他们玩耍方法不同,但是都是吃小鱼。
- 按方案一的思路,这里又创建两个类,并且每次都要写那个完全相同吃鱼方法,显然很不合理。
- 按方案二的思路,这里将父类中的吃东西方法实现成吃鱼的方法。那么新建的两个子类就不需要重写吃鱼的方法,看起来还不错。
- 这时候需求就又来了,我们新的企鹅出生了,他是一个玩耍是健身,吃东西只吃蔬菜的小企鹅,还有爱看暴力企鹅打豆豆的,只吃水果的企鹅,还有一个爱打豆豆,吃蔬菜的企鹅。这时候怎么办。
- 这时候,肯定有人想,我建立一个企鹅工厂,来一种企鹅我加一种。但是你有没有发现,这些企鹅中,他们吃东西和玩耍是交叉的,有的玩耍方法相同,吃东西不同;有的吃东西方法相同,玩耍方法不同。
- 这时候来看看我们策略模式怎么处理。
策略模式实现案例
结构- 这里我们按上图结构,如果还有新的玩耍方法,或者吃东西方法,都可以去相应的协议中去添加实现类,然后,新建企鹅子类去自由组合玩耍方法和吃东西方法。
- 这里协议代码比较简单,就不放出来了,看一下企鹅父类中的实现
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。谢谢。