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

本文共 2703 字,大约阅读时间需要 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.输出

转载地址:http://qdyla.baihongyu.com/

你可能感兴趣的文章
Unity角色控制器CharaterController脚本
查看>>
企业可以自己开发OA系统吗?会遇到什么问题?
查看>>
JavaScript响应式轮播图插件–Flickity
查看>>
有个东西正在悄悄的革容器的命
查看>>
(八)企业级java springboot b2bc商城系统开源源码二次开发 - commonservice-eureka 项目构建过程...
查看>>
Kubernetes不同发行版的比较
查看>>
【Java开发者专场】阿里特邀专家徐雷:Java为王,互联网高并发架构设计选型之路...
查看>>
java springboot b2b2c shop 多用户商城系统源码 (二): 配置管理
查看>>
vim 全选复制
查看>>
CocosCreator Andorid打包找不到JAVA_HOME
查看>>
当心!智能家居中的面部识别功能......
查看>>
数据库索引的作用和创建
查看>>
一半白帽子是单身夜猫子,另外一半...你猜?
查看>>
mysql无备份恢复
查看>>
haproxy 动静分离实例
查看>>
IntelliJ IDEA 18 周岁,吐血推进珍藏已久的必装插件
查看>>
2.Ext JS MVVM特性
查看>>
Kubernetes 中基于策略的资源分配
查看>>
SpringMVC + Shiro重定向次数过多问题
查看>>
Microsoft 宣布 Visual Studio 2019 发布日期
查看>>