设计模式之策略设计模式

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

1.定义

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

2.UML类图

3.实现

1、定义baseStrategy接口CashBase


#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@protocol CashBase <NSObject>
-(CGFloat)acceptCash:(CGFloat)cash;
@end

2.定义Strategy接口子类CashNormal


#import <Foundation/Foundation.h>
#import "CashBase.h"

@interface CashNormal : NSObject<CashBase>

@end


#import "CashNormal.h"

@implementation CashNormal

-(CGFloat)acceptCash:(CGFloat)cash{
    return cash;
}
@end

 定义子类CashRobate


#import <Foundation/Foundation.h>
#import "CashBase.h"
@interface CashRobate : NSObject<CashBase>
-(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 <Foundation/Foundation.h>
#import "CashBase.h"
@interface CaseReturn : NSObject<CashBase>
-(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 <Foundation/Foundation.h>
#import "CashBase.h"
@interface CashContext : NSObject
-(instancetype)initWithCashSuper:(id<CashBase>)cashBase;
-(CGFloat)getResult:(CGFloat)money;
@end


#import "CashContext.h"

@interface CashContext()
@property(strong,nonatomic) id<CashBase> cashSuper;
@end

@implementation CashContext
-(instancetype)initWithCashSuper:(id<CashBase>)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.输出


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值