对于策略模式,我个人理解策略模式就是对各种规则的一种封装的方法,而不仅仅是对算法的封装与调用而已。与工厂模式中简单工厂有点类似,但是比简单工厂更有耦合度,因为策略模式以相同的方法调用所有的规则,减少了规则类和规则类之间的耦合度。

接下来我用策略模式编辑代码来计算斗地主中地主根据坐庄成功失败翻倍情况的得分情况。

创建一个分数类

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学习 策略模式的更多相关文章

  1. 设计模式学习——策略模式(Strategy Pattern)

    0. 前言 最近在重构公司的一个项目的时候,在抽取DES加密重复部分代码的时候,突然间想起了策略模式,感觉策略模式好像可以应用上,于是重新学习了下策略模式.注:在DES加密中,有DES和TDES算法, ...

  2. swift设计模式学习 - 策略模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 策略模式 策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. ...

  3. C++模式学习------策略模式

    当遇到同一个对象有不同的行为,方法,为管理这些方法可使用策略模式. 策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来.通常把一个系列的算法包装到一系列的策略类里面,这些类继承一个抽象的 ...

  4. ios策略模式应用

    策略模式应用大量应用于解决巨型switch-case  if-else..... 具体使用方法 : 策略基类(BaseStrategy)包含一个虚算法,所有子类实现虚算法 容器类含有一个指向策略基类的 ...

  5. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...

  6. 反馈法学习设计模式(一)——策略模式Strategy Pattern

    简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...

  7. 设计模式之策略模式(iOS开发,代码用Objective-C展示)

    在实际开发过程中,app需求都是由产品那边给出,往往是他给出第一版功能,我们写好代码后,会相应的给出第二版.第三版功能,而这些功能是在实际使用中,根据用户需求而不断增加的.如果在编码之初,我们并未认识 ...

  8. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  9. Javascript设计模式学习三(策略模式)

    定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换.目的:将算法的使用和算法的实现分离开来.比如: if(input == 'A'){ return 1; } if(input == ...

随机推荐

  1. 这些年一直记不住的 Java I/O

    参考资料 该文中的内容来源于 Oracle 的官方文档.Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以从这个总入口 Java SE 8 Documentati ...

  2. Webpack+React+ES6开发模式入门指南

    React无疑是今年最火的前端框架,github上的star直逼30,000,基于React的React Native的star也直逼20,000.有了React,组件化似乎不再步履蹒跚,有了Reac ...

  3. 疯狂的JSONP

    何为跨域?何为JSONP?JSONP技术能实现什么?是否有必要使用JSONP技术? 跨域 就是由于JavaScript同源策略的限制,使得a.com域名下的js无法操作b.com或c.a.com域名下 ...

  4. CI Weekly #9 | 揭秘阿里 Docker 化实践之路

    2017年悄然而至,对 flow.ci 你有什么新的期待呢?新的一年,flow.ci会越来越强大好用,希望继续得到你的支持与反馈.最近,我们做了如下的「功能优化」与「问题修复」,看看有没有你想要的: ...

  5. ILMerge合并多个DLL

    序言 如果你的项目要提供多个dll给别人用,那么不妨让你的dll合并为一个,让别人看起来简洁,引用起来不会过于繁琐. 本篇比较少,但也算是比较实用吧. 下载微软的辅助工具ILMerge Imerge下 ...

  6. 黄聪:C#类似Jquery的html解析类HtmlAgilityPack基础类介绍及运用

    Html Agility Pack下载地址:http://htmlagilitypack.codeplex.com/ Html Agility Pack 源码中的类大概有28个左右,其实不算一个很复杂 ...

  7. 网站文件系统发展&&分布式文件系统fastDFS

    网站文件系统发展 1.单机时代的图片服务器架构 初创时期由于时间紧迫,开发人员水平也很有限等原因.所以通常就直接在website文件所在的目录下,建立1个upload子目录,用于保存用户上传的图片文件 ...

  8. 介介介是一个ORM

    介个是一个ORM,介个ORM基于Dapper扩展. 为什么需要一个ORM呢? 支持简单的LINQ查询 但是不能连表查询,why?why?why?为什么不能连接查询 ^.^ ok.但是就是不支持.哈哈哈 ...

  9. WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例

    最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA).我经过两周业余时间的努力,凭着自己对微服务架构的理解,从无到有,基于.NET打造了一个演示微服务架 ...

  10. css预处理器sass使用教程(多图预警)

    css预处理器赋予了css动态语言的特性,如变量.函数.运算.继承.嵌套等,有助于更好地组织管理样式文件,以及更高效地开发项目.css预处理器可以更方便的维护和管理css代码,让整个网页变得更加灵活可 ...