大话设计模式之策略模式

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

策略模式的定义:
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,知识实现不同,他可以以相同的方式调用所有的算法,减少了各类算法类与使用算法类之间的耦合
策略模式的优点 :
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python学习】——语言风格(变量赋值、深浅拷贝、for循环陷阱)

目录 1、赋值 2、赋值的分类——引用赋值、值赋值 1) 不可变对象引用赋值——字符串、数值、元组等 2&#xff09;可变对象引用赋值——列表、集合、字典 3&#xff09;可变与不可变对象的引用赋值内部分析 4&#xff09;在py文件中&#xff0c;和作用域有关&#xff0c;如…

underscore.js 页面数据渲染

1.underscore.js 源码 // Underscore.js 1.8.3 // http://underscorejs.org // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors // Underscore may be freely distributed under the MIT license.(function() {// …

判断庄家是否出货

1. 大盘处于强势的时候 日平均线在横盘的时候&#xff0c;缓慢拉升然后急剧下跌 高位盘整的时候 2. 有利好消息发布的时候 因为庄家会利用这个对于散户来说这个买入时机来进行出货操作&#xff0c;可见庄家真是阴险狡诈转载于:https://www.cnblogs.com/dcz1001/p/6115893.html

【深度学习】——常见深度学习模型总结、anchor-free和anchor-based

目录 1、faster rcnn&#xff1a; 2、SSD&#xff1a; 3、YOLOv1: 小结&#xff1a; 拓展&#xff1a;anchor-based和anchor-free anchor 1、faster rcnn&#xff1a; FasterRcnn 算法原理讲解笔记&#xff08;非常详细&#xff09;https://blog.csdn.net/xjtdw/article…

PHP PDO函数库详解

PDO是一个“数据库访问抽象层”&#xff0c;作用是统一各种数据库的访问接口&#xff0c;与mysql和mysqli的函数库相比&#xff0c;PDO让跨数据库的使用更具有亲和力&#xff1b;与ADODB和MDB2相比&#xff0c;PDO更高效。目前而言&#xff0c;实现“数据库抽象层”任重而道远&…

数据交互相关分享

Python与web Python Web.py与AJAX交互转载于:https://juejin.im/post/5a40af3d6fb9a044ff31b1f5

springMVC 相对于 Structs 的优势

智者说&#xff0c;没有经过自己的思考和估量&#xff0c;就不能接受别人的东西。资料只能是一个参考&#xff0c;至于是否正确&#xff0c;还得自己去分辨 SpringMVC相对于Structs的几个优势&#xff1a; 1、springMVC安全性更高&#xff0c;structs2框架是类级别的拦截&#…

YOLOV1学习

YOLOV1学习&#xff08;输入的图像固定大小为448X448X3&#xff09; 参考文献 模型结构 将输入的图像归一化为大小为448x448x3的图像&#xff0c;然后将经过中间24层的卷积后得到了7x7x1024的特征图&#xff0c;然后后面连接的是两个全连接层&#xff0c;分别是4096和1470&am…

KUKA通信 CREAD问题

嗨。 我想通过串行端口1发送X&#xff0c;Y&#xff0c;Z&#xff0c;A&#xff0c;B&#xff0c;C坐标给机器人。 G1: ...... CREAD(HANDLE,SR_T,MR_T,TIMEOUT,OFFSET,"%F",X) P.XX CREAD(HANDLE,SR_T,MR_T,TIMEOUT,OFFSET,"%F",Y) P.YY ...... GOTO G1…

bzoj 1901: Zju2112 Dynamic Rankings

Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6245 Solved: 2593[Submit][Status][Discuss]Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n]&#xff0c;程序必须回答这样的询问&#xff1a;对于给定的i,j,k&#xff0c;在a[i],a[i1],a[i2]……a[j]中第k小的…

第 36 章 RRDTool

36.1. install $ apt-get install rrdtool原文出处&#xff1a;Netkiller 系列 手札 本文作者&#xff1a;陈景峯 转载请与作者联系&#xff0c;同时请务必标明文章原始出处和作者信息及本声明。

手机号码已经注册写到数据库中,如何利用相同手机号码再次注册?

手机号码已经注册写到数据库中&#xff0c;如何利用相同手机号码再次注册&#xff1f; 解&#xff1a;删除数据库中以前注册的手机号码就可以了啊&#xff0c;delete那条记录&#xff0c;转载于:https://www.cnblogs.com/panxuejun/p/6122499.html

腾讯技术研究类和数据分析第一次笔试(2021.8.22)——Python

第一题&#xff1a;开锁——数学期望 # 最优策略&#xff1a;钥匙的选择先从消耗时间最少的开始选择&#xff0c;然后选择第二小的依次类推 # 开锁概率1/n def openLockTime(n, m, time):time_reverse [] # (n,m)->(m,n)for i in range(m):m_time []for j in range(n):m…

教你怎样选择伺服电机控制方式

伺服电机一般都有三种控制方式&#xff1a;速度控制方式&#xff0c;转矩控制方式&#xff0c;位置控制方式 。 速度控制和转矩控制都是用模拟量来控制的。位置控制是通过发脉冲来控制的。具体采用什么控制方式要根据客户的要求&#xff0c;满足何种运动功能来选择。 …

.Net Discovery系列之四 深入理解.Net垃圾收集机制(下)

上一节给大家介绍了 .Net GC的运行机制&#xff0c;下面来讲下与GC相关的重要方法。 第二节&#xff0e;GC关键方法解析 1.Dispose()方法 Dispose可用于释放所有资源&#xff0c;包括托管的和非托管的&#xff0c;需要自己实现。 大多数的非托管资源都要求手动释放&#xff0c;…

真静态和伪静态的区别

首先肯定的是纯静态和伪静态都是SEO的产物&#xff0c;但纯静态和伪静态还是有很大区别的。 纯静态是生成真实的HTML页面保存到服务器端&#xff0c;用户访问时直接访问这 个HTML页面即可&#xff0c;从而大大的减轻了服务器压力&#xff08;如dedecms就是采用的纯静态&#xf…

非常有趣的Console

console觉醒之路&#xff0c;打印个动画如何&#xff1f; 原文地址: http://www.helloweba.com/view-blog-383.html 批量去掉或替换文本中的换行符&#xff08;notepad、sublime text2&#xff09; 原文地址&#xff1a;http://m.blog.csdn.net/article/details?id43228729 有…

shopee虾皮科技测试工程师第一次笔试

10道单选题 10道多选题 2道编程题 第一题&#xff1a;十进制转二进制计算1的个数&#xff08;负数转为补码&#xff09; #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/8/23 15:44 # Author : linlianqin # Site : # File : 十进制转换为二进制&am…

假期实践

第一天 地点:杭州颐高数码城 第一天&#xff0c;我来到了自己家附近的颐高数码城。文三路这边有一个卖数码产品的一条街&#xff0c;这里也是最贴近我专业实践的地方&#xff0c;所以第一天的实践我选择了这里。 2001年开业的颐高数码广场座落于“电子一条街”文三路、学院路口…

3.AngularJS-过滤器

转自&#xff1a;https://www.cnblogs.com/best/p/6225621.html 二、过滤器 使用过滤器格式化数据&#xff0c;变换数据格式&#xff0c;在模板中使用一个插值变量。语法格式如下&#xff1a; {{ express | filter:parameter1:p2:p3… | … | …}} 过滤器分了内置过滤器与自定义…