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 == ...
随机推荐
- 如何快速开发SPA应用
前言 web早已经进入了2.0时代了,如今的网页大有往系统应用级别的方向发展的趋势,再也不是以前的简单展示信息的界面了.如今很多webapp已经做到了原生应用的功能,并且运用自身的优势逐步取代之.HT ...
- 用SSH访问内网主机的方法
如今的互联网公司通常不会直接自己直接配主机搭建服务器了,而是采用了类似阿里云的这种云主机,当应用变得越来越大了之后,就不可避免地增加主机,而出于成本考虑,不可能给每一台主机都分配公网带宽,所以实际的情 ...
- 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验
在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...
- 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)
本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
- ABP源码分析八:Logger集成
ABP使用Castle日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等.对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方 ...
- MySQL有趣的查询方式
背景介绍 美国大选开始了,国防部要求我对两个总统候选人的票数进行统计.我首先简单的进行一次无条件查询,了解了一下表格的结构及所有数据长什么样子. select * from foo 查询到的结果令我很 ...
- JavaScript随笔3
1.获取非行间css if(oDiv.currentStyle){ alert(oDiv.currentStyle.width); }else{ alert(oDiv.getComputedStyle ...
- JavaScript随笔2
JavaScript的组成:ECMA.DOM.BOM闭包,子函数可以使用父函数的局部变量 函数:arguments是个参数数组oDiv.style.width:只能操作行间的样式.在IE下oDiv.c ...
- Grunt(页面静态引入的文件地址的改变探究)-V2.0
相关插件的引用: grunt-usemin 对页面的操作 grunt-contrib-cssmin 压缩css load-grunt-tasks 瘦身gruntfile grunt-rev给md5 ...
- 《JavaScript 源码分析》之 maxlength.js
/* @author: Terry @params: feedback - the selector for the element that gives the user feedback. Not ...