iOS模式分析-策略模式
来源:互联网 发布:南京天梯培训中心 知乎 编辑:程序博客网 时间:2024/06/01 07:31
好久了,过去了一个月没有动笔写东西了,除了工作的忙,还有最近在学习一个课程和看一些技术类的书籍,腾不出时间来写博客了,说了这么多,其实归根结底都是我懒的借口,确实挺惭愧,还是得继续加油,多写多练习,做更好的自己。。。
策略模式
本文使用OC语言实现策略模式的实现
定义
定义一系列可以相互替换的算法类,提供给客户端相同的调用接口,客户端调用不同的对象的相同方法来达到快速切换算法的目的。
使用场景
下面是从编程原则讨论策略模式的使用场景
- 针对同一个问题的多种不同的处理方式,但是具体的实现有差异,需要实现统一的接口,对变化部分进行封装【面向抽象而非面向具体原则】。
- 分支太多导致了客户端对算法实现类的依赖太大,算法扩展需要去修改实现--添加对应的分支,使得扩展不方便以及算法类中的代码量膨胀。为了让算法类的扩展容易,需要对具体的算法独立封装【开闭原则】;为了让算法代码保持最小和最简单,需要对具体的算法独立实现【单一职责原则】。
案例实现
理财产品的回报计算,处理方式是一样的,客户端只要给固定的参数(平台、月份、金额),需要计算出本金及利息的和,不同理财产品的计算接口定义是统一的,在实现上有差别,所以类似这种场景是比较适合使用策略模式的。
不同产品的利率:
有利网:
短期理财:6个月以内,年化收益:3%
中期理财:12个月以内,年化收益:4%
长期理财:24个月以内,年化收益:4.5%
支付宝:
定期理财3个月,年化收益:7%
定期理财6个月,年化收益:8%
定期理财12个月,年化收益:9.5%
定期理财24个月,年化收益:10.5% :10.5%
下面是理财产品这个案例的具体模块的代码实现。
定义策略接口
这个案例中策略接口是理财产品计算算法的接口
#import <Foundation/Foundation.h>@protocol FinancyStrategyProtocal <NSObject>- (NSInteger)financyWithMonth:(NSInteger)month money:(NSInteger)money;@end
定义Context类
Context类使用到了算法对象,这个对象是可以相互替换的
// FinancyContext.h#import <Foundation/Foundation.h>#import "FinancyStrategyProtocal.h"@interface FinancyContext : NSObject@property (nonatomic, strong) id<FinancyStrategyProtocal> financy;- (instancetype)initWithFinancy:(id<FinancyStrategyProtocal>)financy;- (NSInteger)financyWithMonth:(NSInteger)month money:(NSInteger)money;@end// FinancyContext.m#import "FinancyContext.h"@implementation FinancyContext- (instancetype)initWithFinancy:(id<FinancyStrategyProtocal>)financy { self = [super init]; if (self) { _financy = financy; } return self;}- (NSInteger)financyWithMonth:(NSInteger)month money:(NSInteger)money { return [_financy financyWithMonth:month money:money];}@end
策略类的具体实现
A. 有利网的算法策略实现
// YouLiFinancyStrategy.h#import <Foundation/Foundation.h>#import "FinancyStrategyProtocal.h"@interface YouLiFinancyStrategy : NSObject <FinancyStrategyProtocal>@end// YouLiFinancyStrategy.m#import "YouLiFinancyStrategy.h"@implementation YouLiFinancyStrategy- (NSInteger)financyWithMonth:(NSInteger)month money:(NSInteger)money {// 短期理财:6个月以内,年化收益:3%// 中期理财:12个月以内,年化收益:4%// 长期理财:24个月以内,年化收益:4.5% if (month <= 6) { return money * 0.03f / 12 * month + money; } else if (month <= 12) { return money * 0.04f / 12 * month + money; } else if (month <= 24) { return money * 0.045f / 12 * month + money; } return 0;}@end
A. 余额宝的算法策略实现
// AlipayFinancyStrategy.h#import <Foundation/Foundation.h>#import "FinancyStrategyProtocal.h"@interface AlipayFinancyStrategy : NSObject <FinancyStrategyProtocal>@end// AlipayFinancyStrategy.m#import "AlipayFinancyStrategy.h"@implementation AlipayFinancyStrategy - (NSInteger)financyWithMonth:(NSInteger)month money:(NSInteger)money {// 定期理财3个月,年化收益:7%// 定期理财6个月,年化收益:8%// 定期理财12个月,年化收益:9.5%// 定期理财24个月,年化收益:10.5% if (month <= 3) { return money * 0.07f / 12 * month + money; } else if (month <= 6) { return money * 0.08f / 12 * month + money; } else if (month <= 12) { return money * 0.095f / 12 * month + money; } else if (month <= 24) { return money * 0.105f / 12 * month + money; } return 0;}@end
客户端使用
id<FinancyStrategyProtocal> alipayFinancy = [[AlipayFinancyStrategy alloc] init]; FinancyContext* context = [[FinancyContext alloc] initWithFinancy:alipayFinancy]; NSInteger money = [context financyWithMonth:6 money:10000]; NSLog(@"Alipay money = %@", @(money)); id<FinancyStrategyProtocal> ylFinancy = [[YouLiFinancyStrategy alloc] init]; context.financy = ylFinancy; money = [context financyWithMonth:6 money:10000]; NSLog(@"YouLi money = %@", @(money));
UML分析
Demo
StrategyPatternDemo
阅读全文
0 0
- iOS模式分析-策略模式
- iOS 设计模式 - 策略模式
- IOS设计模式--策略模式
- iOS设计模式 - 策略模式
- iOS 策略设计模式
- 策略模式(STRATEGY)案例分析
- 设计模式之策略模式简要分析
- 粗糙分析设计模式-策略模式
- iOS开发设计策略模式
- iOS与设计模式二:策略模式
- iOS设计模式 - (4)策略模式
- iOS设计模式之策略模式
- iOS设计模式 - (4)策略模式
- iOS设计模式-策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- IOS 工厂模式的面向协议编程思想
- UITableViewCell使用自动布局的“最佳实践”
- 升级到XCode9(BaseSDK:iOS11)的各种坑 持续更新中
- UML入门
- 比较synchronized和读写锁
- iOS模式分析-策略模式
- JavaScript常用属性
- Cocopods安装和升级备忘录
- iOS逆向之一-工具的安装和使用
- 编写Spring框架的配置文件时,标签无提示的解决办法
- iOS逆向之二-一个简单的Tweak插件原理解析
- Maven 编译时报错 -source 1.5 中不支持 multi-catch 语句 的解决办法
- “趣店”等现金贷的前身,为啥在美国成“过街老鼠”?
- jquery ajax