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

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

创建一个分数类

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. 一步步学习javascript基础篇(9):ajax请求的回退

    需求1: ajax异步请求 url标识请求参数(也就是说复制url在新页面打开也会是ajax后的效果) ajax异步请求没问题,问题一般出在刷新url后请求的数据没了,这就是因为url没有记录参数.如 ...

  2. c += c-- | ++b;

    一切都是从这开始的 一个大一学弟通过QQ给我发来一个C++的题: int c = 8, b = 3; c += c-- | ++b; 问c的值是多少.通过笔算得到c为19,然后随手建了个C#控制台项目 ...

  3. BoneCP 升级遇到的问题

    Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [c ...

  4. JS设计模式(二)

    5.迭代器模式 先实现一个简单的迭代器,类似于JQ里的$.each方法. var each = function (arr, callback) { for (var i = 0, l = arr.l ...

  5. delete

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. jQuery? 回归JavaScript原生API

    如今技术日新月异,各类框架库也是层次不穷.即便当年漫山红遍的JQuery(让开发者write less, do more,So Perfect!!)如今也有被替代的大势.但JS原生API写法依旧:并且 ...

  7. PDO

    'PDO'是数据访问抽象层'用mysqli类找到mysqli驱动根据驱动操作mysqli数据库'其他类找到sqlserver驱动根据驱动操作sqlserve数据库'PDO 访问其他数据库 PDO的用法 ...

  8. git命令分类图

  9. [C#] 走进异步编程的世界 - 剖析异步方法(下)

    走进异步编程的世界 - 剖析异步方法(下) 序 感谢大家的支持,这是昨天发布<走进异步编程的世界 - 剖析异步方法(上)>的补充篇. 目录 异常处理 在调用方法中同步等待任务 在异步方法中 ...

  10. 一个可随意定位置的带色Toast——开源代码Crouton的简单使用

    今天在公司要求的代码中,要求显示的提示能够更加具有多样化,而不是简单的Toast字样,第一想法肯定是自定义View呀,结果在浏览中发现还有这样的一个开源代码——Crouton. 几经折腾,发现这个东西 ...