策略模式-只要涉及到算法都可以使用
2019-03-04 本文已影响0人
架构师的一小步
引言:一个前辈的视屏教导,仅个人使用笔记
基本概念
1.定义了一系列算法
2.每一个算法单独封装
3.每一个算法都可以相互替换
4.客户端可以独立变换算法(客户端:调用者)
策略模式应用场景
1.针对同一类型的问题多种处理方式,仅仅只是具体的行为有差异(一道题多种解法)
2.需要安全的封装同一类型的操作
3.出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类的时候
例如:开发场景例子?
加密算法->策略模式
磁盘缓存->策略模式
图片缓存(磁盘缓存、内存缓存双缓存(磁盘+内存))
团队开发时候->多个人开发不同算法写在同一个工具类:弊端:不利于扩展维护
->解决方案:策略模式
策略模式角色划分
核心角色:策略接口,具体策略
1.策略接口
2.具体策略
3.策略上下文(管理器)或者工厂不一定
原理案例: 打折促销
1.策略接口: Promotion
#import <Foundation/Foundation.h>
//策略接口
NS_ASSUME_NONNULL_BEGIN
@protocol Promotion <NSObject>
-(int)initWithMouth:(int)mouth money:(float)money;
@end
NS_ASSUME_NONNULL_END
2.具体策略:JingDong、SuNing
#import <Foundation/Foundation.h>
#import "Promotion.h"
NS_ASSUME_NONNULL_BEGIN
@interface SuNing : NSObject<Promotion>
@end
NS_ASSUME_NONNULL_END
#import "SuNing.h"
@implementation SuNing
- (int)initWithMouth:(int)mouth money:(float)money {
if(mouth==3)
{
return mouth*0.8;
}else if(mouth==6)
{
return mouth*0.9;
}else if(mouth==9)
{
return mouth*0.75;
}
return 0;
}
#import <Foundation/Foundation.h>
#import "Promotion.h"
NS_ASSUME_NONNULL_BEGIN
@interface JingDong : NSObject<Promotion>
@end
NS_ASSUME_NONNULL_END
#import "JingDong.h"
@implementation JingDong
- (int)initWithMouth:(int)mouth money:(float)money {
if(mouth==3)
{
return mouth*0.5;
}else if(mouth==6)
{
return mouth*0.6;
}else if(mouth==9)
{
return mouth*0.75;
}
return 0;
}
@end
3.策略上下文main.m
#import <Foundation/Foundation.h>
#import "SuNing.h"
#import "JingDong.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
id<Promotion> promotion=[[SuNing alloc]init];
int money=[promotion initWithMouth:6 money:10000];
NSLog(@"%d",money);
}
return 0;
}