IOS之Objective-C学习 策略模式
对于策略模式,我个人理解策略模式就是对各种规则的一种封装的方法,而不仅仅是对算法的封装与调用而已。与工厂模式中简单工厂有点类似,但是比简单工厂更有耦合度,因为策略模式以相同的方法调用所有的规则,减少了规则类和规则类之间的耦合度。
接下来我用策略模式编辑代码来计算斗地主中地主根据坐庄成功失败翻倍情况的得分情况。
创建一个分数类
Score.h
#import <Foundation/Foundation.h>
#define BASIC_POINT 10
@interface Score : NSObject
@property(nonatomic,assign)double Score;
-(double)getScore;
@end
Score.m
#import "Score.h"
@implementation Score
-(instancetype)init{
self=[super init];
if (self) {
self.Score=BASIC_POINT;
}
return self;
}
-(double)getScore{
return NO;
}
@end
winScore.h
#import "Score.h"
@interface winScore : Score
@end
winScore.m
#import "winScore.h"
@implementation winScore
/*
*胜利得分
*/
-(double)getScore{
return self.Score;
}
@end
loseScore.h
#import "Score.h"
@interface loseScore : Score
@end
loseScore.m
#import "loseScore.h"
@implementation loseScore
/*
*失败得分
*/
-(double)getScore{
return self.Score*-1;
}
@end
BombScore.h
#import "Score.h"
@interface BombScore : Score
@property(nonatomic,assign)int bombCount;
-(instancetype)initWithbombCount:(int)counts;
@end
BombScore.m
#import "BombScore.h"
@implementation BombScore
/*
*翻倍得分
*/
-(instancetype)initWithbombCount:(int)bombCount{
self=[super init];
if (self) {
_bombCount=bombCount;
}
return self;
}
-(double)getScore{
double d=self.bombCount+1;
return d*self.Score;
}
@end
ScoreResult.h
#import <Foundation/Foundation.h>
#import "Score.h"
#import "loseScore.h"
#import "winScore.h"
#import "BombScore.h"
@interface ScoreResult : NSObject
@property(nonatomic,strong) Score* score;
-(instancetype)initWithSituation:(NSString *)str;
@end
ScoreResult.m
#import "ScoreResult.h"
@implementation ScoreResult
-(instancetype)initWithSituation:(NSString *)str{
self=[super init];
if (self) {
[self settleScore:str];
}
return self;
}
-(void)settleScore:(NSString *)param{
if ([param isEqualToString:@"成功"]) {
self.score=[[winScore alloc]init];
}
else if([param isEqualToString:@"翻倍"]){
self.score=[[BombScore alloc]initWithbombCount:1];//炸弹数暂时设为1
}
else{
self.score=[[loseScore alloc]init];
}
}
@end
执行代码:
#import "ViewController.h"
#import "ScoreResult.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
ScoreResult *sr1=[[ScoreResult alloc]initWithSituation:@"翻倍"];
double score1= [sr1.score getScore];
NSLog(@"score1=%f",score1);
ScoreResult *sr2=[[ScoreResult alloc]initWithSituation:@"成功"];
double score2= [sr2.score getScore];
NSLog(@"score2=%f",score2);
ScoreResult *sr3=[[ScoreResult alloc]initWithSituation:@"失败"];
double score3= [sr3.score getScore];
NSLog(@"score3=%f",score3);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
运行结果:
score1=20.000000
score2=10.000000
score3=-10.000000
对策略模式做一个总结,策略模式是将一些规律封装策略的context类中,然后通过调用策略context类中的方法就可以得出想要的结果。上述代码中ScoreResult类就是策略的Context类。
IOS之Objective-C学习 策略模式的更多相关文章
- 设计模式学习——策略模式(Strategy Pattern)
0. 前言 最近在重构公司的一个项目的时候,在抽取DES加密重复部分代码的时候,突然间想起了策略模式,感觉策略模式好像可以应用上,于是重新学习了下策略模式.注:在DES加密中,有DES和TDES算法, ...
- swift设计模式学习 - 策略模式
移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 策略模式 策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. ...
- C++模式学习------策略模式
当遇到同一个对象有不同的行为,方法,为管理这些方法可使用策略模式. 策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来.通常把一个系列的算法包装到一系列的策略类里面,这些类继承一个抽象的 ...
- ios策略模式应用
策略模式应用大量应用于解决巨型switch-case if-else..... 具体使用方法 : 策略基类(BaseStrategy)包含一个虚算法,所有子类实现虚算法 容器类含有一个指向策略基类的 ...
- JavaScript设计模式之策略模式(学习笔记)
在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...
- 反馈法学习设计模式(一)——策略模式Strategy Pattern
简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...
- 设计模式之策略模式(iOS开发,代码用Objective-C展示)
在实际开发过程中,app需求都是由产品那边给出,往往是他给出第一版功能,我们写好代码后,会相应的给出第二版.第三版功能,而这些功能是在实际使用中,根据用户需求而不断增加的.如果在编码之初,我们并未认识 ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- Javascript设计模式学习三(策略模式)
定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换.目的:将算法的使用和算法的实现分离开来.比如: if(input == 'A'){ return 1; } if(input == ...
随机推荐
- 关于《Linux.NET学习手记(8)》的补充说明
早前的一两天<Linux.NET学习手记(8)>发布了,这一篇主要是讲述OWIN框架与OwinHost之间如何根据OWIN协议进行通信构成一套完整的系统.文中我们还直接学习如何直接操作OW ...
- SVG:linearGradient渐变在直线上失效的问题解决方案
SVG开发里有个较为少见的问题. 对x1=x2或者y1=y2的直线(line以及path),比如: <path d="M200,10 200,100" stroke=&quo ...
- 超炫的HTML5粒子效果进度条 VS 如何规范而优雅地code
最近瞎逛的时候发现了一个超炫的粒子进度效果,有多炫呢?请擦亮眼镜! // _this.ch){ _this.particles.splice(i, 1); } }; this.Particle.p ...
- Angular移除不必要的$watch之性能优化
双向绑定是Angular的核心概念之一,它给我们带来了思维方式的转变:不再是DOM驱动,而是以Model为核心,在View中写上声明式标签.然后,Angular就会在后台默默的同步View的变化到Mo ...
- 程序猿是如何解决SQLServer占CPU100%的
文章目录 遇到的问题 使用SQLServer Profiler监控数据库 SQL1:查找最新的30条告警事件 SQL2:获取当前的总报警记录数 有哪些SQL语句会导致CPU过高? 查看SQL的查询计划 ...
- 深入解析js异步编程利器Generator
我们在编写Nodejs程序时,经常会用到回调函数,在一个操作执行完成之后对返回的数据进行处理,我简单的理解它为异步编程. 如果操作很多,那么回调的嵌套就会必不可少,那么如果操作非常多,那么回调的嵌套就 ...
- 相关query挖掘
1.何为相关query 我通常也把相关query称为相似query,搜索日志中一个用户在短时间内的一系列搜索词被称为相关query.相关就是两个query间有一定的关系,反映了用户在当时的需求.本文就 ...
- jQuery全局Ajax事件处理器
1. .ajaxComplete( handler(event, XMLHttpRequest, ajaxOptions) ) 每当一个Ajax请求完成,jQuery就会触发ajaxComplete ...
- 判断CPU是大端还是小端模式
在小端模式中,低位字节放在低地址,高位字节放在高地址:在大端模式中,低位字节放在高地址,高位字节放在低地址.big-endian和little-endian,51单片机是典型的大端模式,Intel电脑 ...
- Android动画效果之Property Animation进阶(属性动画)
前言: 前面初步认识了Android的Property Animation(属性动画)Android动画效果之初识Property Animation(属性动画)(三),并且利用属性动画简单了补间动画 ...