博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之策略设计模式
阅读量:5124 次
发布时间:2019-06-13

本文共 2793 字,大约阅读时间需要 9 分钟。

问题引入:在一些购物系统,可能会在搞一些促销,比如满多少减多少,全场打折等,那这样的怎么设计比较好呢?这时策略模式就是一个很好的解决方法。

1.定义

定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

2.UML类图

3.实现

1、定义baseStrategy接口CashBase

#import 
#import
@protocol CashBase
-(CGFloat)acceptCash:(CGFloat)cash;@end

2.定义Strategy接口子类CashNormal

#import 
#import "CashBase.h"@interface CashNormal : NSObject
@end
#import "CashNormal.h"@implementation CashNormal-(CGFloat)acceptCash:(CGFloat)cash{    return cash;}@end

 定义子类CashRobate

#import 
#import "CashBase.h"@interface CashRobate : NSObject
-(instancetype)initWithMoneyRebate:(CGFloat)moneyRebate;@end
#import "CashRobate.h"@interface CashRobate ()@property(nonatomic)CGFloat moneyRebate;@end@implementation CashRobate-(instancetype)initWithMoneyRebate:(CGFloat)moneyRebate{    self = [super init];    if (self) {        _moneyRebate = moneyRebate;    }    return self;}-(CGFloat)acceptCash:(CGFloat)cash{    return self.moneyRebate * cash;}@end

定义子类CaseReturn

#import 
#import "CashBase.h"@interface CaseReturn : NSObject
-(instancetype)initWithMoneyCondition:(CGFloat)moneyCondition moneyReturn:(CGFloat)moneyReturn;@end
#import "CaseReturn.h"@interface CaseReturn ()@property(nonatomic)CGFloat moneyCondition;@property(nonatomic)CGFloat moneyReturn;@end@implementation CaseReturn-(instancetype)initWithMoneyCondition:(CGFloat)moneyCondition moneyReturn:(CGFloat)moneyReturn{    self = [super init];    if (self) {        _moneyCondition = moneyCondition;        _moneyReturn = moneyReturn;    }    return self;}-(CGFloat)acceptCash:(CGFloat)cash{    return self.moneyCondition - self.moneyReturn;}@end

定义context

#import 
#import "CashBase.h"@interface CashContext : NSObject-(instancetype)initWithCashSuper:(id
)cashBase;-(CGFloat)getResult:(CGFloat)money;@end
#import "CashContext.h"@interface CashContext()@property(strong,nonatomic) id
cashSuper;@end@implementation CashContext-(instancetype)initWithCashSuper:(id
)cashBase{ self = [super init]; if (self) { self.cashSuper = cashBase; } return self;}-(CGFloat)getResult:(CGFloat)money{ return [self.cashSuper acceptCash:money];}@end

4.调用

CashRobate *robate = [[CashRobate alloc]initWithMoneyRebate:0.8];    CashContext *context = [[CashContext alloc]initWithCashSuper:robate];    NSLog(@"结果是%f",[context getResult:100]);        CaseReturn *cashReturn = [[CaseReturn alloc]initWithMoneyCondition:300 moneyReturn:100];    CashContext *contextReturn = [[CashContext alloc]initWithCashSuper:cashReturn];    NSLog(@"结果是%f",[contextReturn getResult:0]);

5.输出

转载于:https://www.cnblogs.com/5ishare/p/4882540.html

你可能感兴趣的文章
算法和数据结构(三)
查看>>
Ubuntu下的eclipse安装subclipse遇到没有javahl的问题...(2天解决了)
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
WCF揭秘——使用AJAX+WCF服务进行页面开发
查看>>
【题解】青蛙的约会
查看>>
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>
面向对象的设计原则
查看>>
Swift3.0服务端开发(三) Mustache页面模板与日志记录
查看>>
【转】 FPGA设计的四种常用思想与技巧
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
基于C#编程语言的Mysql常用操作
查看>>
s3c2440实验---定时器
查看>>
MyEclipse10安装SVN插件
查看>>
[转]: 视图和表的区别和联系
查看>>
Regular Experssion
查看>>
图论例题1——NOIP2015信息传递
查看>>