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

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

创建一个分数类

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. Javascript设计模式学习三(策略模式)

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

  9. 【2016-10-14】【坚持学习】【Day5】【策略模式】

    今天学了策略模式 例子 一个售票系统,针对不同的用户使用不用的计价方式, 环境类:一个业务场景(电影票累,) 抽象类:计价算法 具体实现类:5折算法,满100减20算法,..... 抽象策略类 abs ...

随机推荐

  1. Node.js用ES6原生Promise对异步函数进行封装

    Promise的概念 Promise 对象用于异步(asynchronous)计算..一个Promise对象代表着一个还未完成,但预期将来会完成的操作. Promise的几种状态: pending:初 ...

  2. 实验一(不知道怎么上传.docx格式)

    北京电子科技学院(BESTI) 实     验    报     告 课程:深入理解计算机系统        班级:1353 姓名:魏静静 文艺 刘虹辰 学号:20135302 20135331 20 ...

  3. Delphi的Socket编程步骤(repulish)

    转贴自:http://topic.csdn.net/t/20010727/16/212155.html ClientSocket 和ServerSocket几个重要的属性:   1.client和se ...

  4. css中overflow:hidden的属性 可能会导致js下拉菜单无法显示

    css中overflow:hidden属性导致ExtJS中无法显示下拉滚动条 overflow属性: visible 默认.内容不会被修剪,会呈现在元素之外. hidden 内容会被修剪,但是浏览器不 ...

  5. 性能优化-列表类型转换(ConvertList&lt;TSource, TResult&gt;)

    之前,在项目中看到过一段通用列表类型转换的代码,直接的实现便是用反射.大概看了下,它用在领域模型转DTO和SOA接口中契约实体的转换等等.首先,它使用了反射,其次,还是在循环中使用,便有了优化的想法. ...

  6. ios学习- 10大iOS开发者最喜爱的类库

    该10大iOS开发者最喜爱的库由“iOS辅导团队”成员Marcelo Fabri组织投票选举而得,参与者包括开发者团队,iOS辅导团队以及行业嘉宾.每个团队都要根据以下规则选出五个最好的库: 1)不能 ...

  7. SQLite笔记

    一.SQLite下载: http://www.sqlite.org/download.html (或在NuGet下载安装) 二.SQLite操作: 1.添加引用System.Data.SQLite,如 ...

  8. cordova build android Command failed with exit code EACCES

    问题: 执行cordova build android 出现输出如下,编译不成功. ANDROID_HOME=/Users/huangenai/Library/Android/sdkJAVA_HOME ...

  9. vscode 配置php

    vscode 的官网:https://code.visualstudio.com/docs/languages/php 添加扩张程序: php的设置: php格式化是安装“PHP Intelephen ...

  10. centos6.5安装部署zabbix监控服务端和客户端

    部署zabbix服务端需要LNMP环境(nginx,mysql,php),其它数据库也可以,我这里使用mysql,关于LNMP环境部署,可以参考我的另一遍文章:http://www.cnblogs.c ...