设计模式之策略设计模式

简介:

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

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.输出


相关文章
|
7月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
153 0
|
7月前
|
设计模式 编解码 C++
【ffmpeg 视频播放】深入探索:ffmpeg视频播放优化策略与设计模式的实践应用(一)
【ffmpeg 视频播放】深入探索:ffmpeg视频播放优化策略与设计模式的实践应用
214 0
|
7月前
|
设计模式 存储 缓存
【ffmpeg 视频播放】深入探索:ffmpeg视频播放优化策略与设计模式的实践应用(二)
【ffmpeg 视频播放】深入探索:ffmpeg视频播放优化策略与设计模式的实践应用
148 0
|
2月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
7月前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
133 2
|
4月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
66 1
|
5月前
|
设计模式 安全 Java
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
132 0
|
7月前
|
设计模式 Java
设计模式之策略 Strategy
设计模式之策略 Strategy
49 1
|
设计模式 算法 搜索推荐
设计模式—策略(Strategy)模式
设计模式—策略(Strategy)模式
162 1
|
7月前
|
设计模式 缓存 安全
分析设计模式对Java应用性能的影响,并提供优化策略
【4月更文挑战第7天】本文分析了7种常见设计模式对Java应用性能的影响及优化策略:单例模式可采用双重检查锁定、枚举实现或对象池优化;工厂方法和抽象工厂模式可通过对象池和缓存减少对象创建开销;建造者模式应减少构建步骤,简化复杂对象;原型模式优化克隆方法或使用序列化提高复制效率;适配器模式尽量减少使用,或合并多个适配器;观察者模式限制观察者数量并使用异步通知。设计模式需根据应用场景谨慎选用,兼顾代码质量和性能。
63 0