第二章:商场促销——策略模式

策略模式的定义:
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,知识实现不同,他可以以相同的方式调用所有的算法,减少了各类算法类与使用算法类之间的耦合
策略模式的优点 :
1. 策略模式的Strategy 类层次为Context定义了一些列的可供重用的算法或行为。继承有助于析取这些算法中的公共功能
2.简化了单元测试,因为每个算法都要自己的类,可以通过自己的接口单独测试
当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为,将这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句
策略模式就是用来封装算法的,但是在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同实践应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性
在基本的策略模式中,选择所用具体实现的职责有客户端对象承担,并转给策略模式的Context对象

父类CashSuper

CashSuper.h

@interface CashSuper : NSObject
-(double)acceptCash:(double)money;
@end

CashSuper.m

@implementation CashSuper

-(double)acceptCash:(double)money{

return money;

}

@end

正常消费类 CashNormal

CashNormal.h

#import <Foundation/Foundation.h>
#import "CashSuper.h"
@interface CashNormal : CashSuper@end

CashNormal.m

#import "CashNormal.h"@implementation CashNormal
-(double)acceptCash:(double)money{return money;
}
@end

打折消费类CashRebate

CashRebate.h

#import <Foundation/Foundation.h>
#import "CashSuper.h"
@interface CashRebate : CashSuper
@property(assign,nonatomic)double Rebate;
-(instancetype)initWithRebate:(double) Rebate;
@end

CashRebate.m

#import "CashRebate.h"@implementation CashRebate
- (instancetype)initWithRebate:(double)Rebate{self = [super init];if (self) {_Rebate=Rebate;}return self;
}
-(double)acceptCash:(double)money{return money*_Rebate;
}
@end

返利消费类CashReturn

CashReturn.h

#import <Foundation/Foundation.h>
#import "CashSuper.h"
@interface CashReturn : CashSuper
@property(assign,nonatomic)double moneyCondition;
@property(assign,nonatomic)double moneyReturn;
-(instancetype)initWithMoneyCondition:(double)moneyCondition :(double)moneyReturn;
@end

CashReturn.m

#import "CashReturn.h"@implementation CashReturn
-(instancetype)initWithMoneyCondition:(double)moneyCondition :(double)moneyReturn
{self = [super init];if (self) {_moneyCondition=moneyCondition;_moneyReturn=moneyReturn;}return self;
}
-(double)acceptCash:(double)money{double result=money;if (money>=_moneyCondition) {result=money-((int)(money/_moneyCondition))*_moneyReturn;}return result;
}
@end

配置类,维护对对象的使用CashContext类

CashContext.h

#import <Foundation/Foundation.h>
#import "CashSuper.h"
@interface CashContext : NSObject
@property(nonatomic,strong)CashSuper *cashsuper;
-(instancetype)initWith:(CashSuper *)csuper;
-(double)GetResult:(double)money;
@end

CashContext.m

#import "CashContext.h"@implementation CashContext
- (instancetype)initWith:(CashSuper *)csuper
{self = [super init];if (self) {_cashsuper=csuper;}return self;
}
-(double)GetResult:(double)money{return  [_cashsuper acceptCash:money];}
@end

主函数

#import <Foundation/Foundation.h>
#import "CashContext.h"
#import "CashSuper.h"
#import "CashNormal.h"
#import "CashRebate.h"
#import "CashReturn.h"
int main(int argc, const char * argv[]) {@autoreleasepool {char type='B';double result=0.0;CashContext *cc=nil;switch (type) {case 'N':cc=[[CashContext alloc]initWith:[[CashNormal alloc]init]];break;case 'B':cc=[[CashContext alloc]initWith:[[CashRebate alloc]initWithRebate:0.7]];break;case 'T':cc=[[CashContext alloc]initWith:[[CashReturn alloc] initWithMoneyCondition:300 :100]];break;}result = [cc GetResult:500];NSLog(@"%f",result);}return 0;
}

运行打折类

转载于:https://www.cnblogs.com/qianLL/p/5232126.html

大话设计模式之策略模式相关推荐

  1. 【大话设计模式】策略模式

    策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 策略模式是一种定义一系列算法的方法,从概念上看,这些算法完成的都是相同的工作,只是实现不同 ...

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

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

  3. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  4. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

  5. 研磨设计模式之 策略模式--转

    http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式   2010-09-09 作者:云飞龙行 来源:云飞龙行的blog   先感谢众多朋友的支持 ...

  6. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  7. C++设计模式之策略模式(Strategy)

    Strategy策略模式 作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: 代码实现 #include <iostream& ...

  8. python策略模式包含角色_详解Python设计模式之策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...

  9. 一篇博客读懂设计模式之-----策略模式

    设计模式之策略模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的对象 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下 ...

最新文章

  1. FSWD_2_JavaScript
  2. 并查集-hdu3083-How Many Answers Are Wrong
  3. 少儿编程语言python-2019儿童编程语言大全
  4. 自定义控件:流式布局
  5. Python常用模块之configparser
  6. android aar编程,AndroidStudio脚本命令指定AAR生成目录与版本号
  7. 大剑无锋之介绍一下B+树【面试推荐】
  8. HDU 6836 Expectation(矩阵生成树 + 期望)
  9. 在PhotoShop中改像素m*n
  10. 升级过log4j,却还没搞懂log4j漏洞的本质?
  11. 马斯克:特斯拉汽车产量今年有望达到50万辆
  12. 易语言html实现报表打印,易语言报表统计功能例程可打印
  13. 浅谈C#的垃圾回收-关于GC、析构函数、Dispose、and Finalize asp.net GC之析构函数详解...
  14. html js 处理元素的数据属性(data)
  15. FillRect、FrameRect与Rectangle矩形绘制函数使用对比分析
  16. 磁盘读写的时间花费和调度算法(操作系统)
  17. iOS 录视频,相册选择视频,视频压缩,存储本地文件,播放,上传
  18. OpenCV如何进行图像的平滑和锐化处理?
  19. 隐藏tab标签完美解决办法
  20. html怎么设置毛笔字体,原来毛笔字体是这么设计的!

热门文章

  1. generator mysql插件_mybatis Generator最佳实践(数据库:mysql)
  2. python 浏览器,轻量级Python Web浏览器
  3. Win10美吱er吱er,Win10修改默认字体的方法
  4. 我用AI回怼美女汽车销售系列[yolo车牌识别](五) 完结
  5. 图数据集之cora数据集介绍 --- 适用于GCN任务
  6. 【网络设计_RegNet】Designing Network Design Spaces_2020
  7. 零信任模型_关于信任模型
  8. Chapter 5:Spectral-Subtractive Algorithms
  9. CRectTracker类的使用方法及其静态库下CRectTracker无法显示鼠标光标解决方案
  10. 小技巧,怎么让MFC的MDI程序子窗口看起来有扁平的效果