架构设计基础

策略模式-只要涉及到算法都可以使用

2019-03-04  本文已影响0人  架构师的一小步

引言:一个前辈的视屏教导,仅个人使用笔记

基本概念

1.定义了一系列算法
2.每一个算法单独封装
3.每一个算法都可以相互替换
4.客户端可以独立变换算法(客户端:调用者)

策略模式应用场景

1.针对同一类型的问题多种处理方式,仅仅只是具体的行为有差异(一道题多种解法)
2.需要安全的封装同一类型的操作
3.出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类的时候

例如:开发场景例子?
加密算法->策略模式
磁盘缓存->策略模式
图片缓存(磁盘缓存、内存缓存双缓存(磁盘+内存))

团队开发时候->多个人开发不同算法写在同一个工具类:弊端:不利于扩展维护->解决方案:策略模式

策略模式角色划分

核心角色:策略接口,具体策略
1.策略接口
2.具体策略
3.策略上下文(管理器)或者工厂不一定

原理案例: 打折促销
1.策略接口: Promotion

#import <Foundation/Foundation.h>
//策略接口
NS_ASSUME_NONNULL_BEGIN

@protocol Promotion <NSObject>

-(int)initWithMouth:(int)mouth money:(float)money;

@end

NS_ASSUME_NONNULL_END

2.具体策略:JingDong、SuNing

#import <Foundation/Foundation.h>
#import "Promotion.h"
NS_ASSUME_NONNULL_BEGIN

@interface SuNing : NSObject<Promotion>

@end

NS_ASSUME_NONNULL_END

#import "SuNing.h"

@implementation SuNing


- (int)initWithMouth:(int)mouth money:(float)money {
    if(mouth==3)
    {
        return mouth*0.8;
    }else if(mouth==6)
    {
        return mouth*0.9;
    }else if(mouth==9)
    {
        return mouth*0.75;
    }
    return 0;
}

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

NS_ASSUME_NONNULL_BEGIN

@interface JingDong : NSObject<Promotion>


@end

NS_ASSUME_NONNULL_END
#import "JingDong.h"

@implementation JingDong

- (int)initWithMouth:(int)mouth money:(float)money {
    if(mouth==3)
    {
        return mouth*0.5;
    }else if(mouth==6)
    {
        return mouth*0.6;
    }else if(mouth==9)
    {
        return mouth*0.75;
    }
    return 0;
}
@end

3.策略上下文main.m

#import <Foundation/Foundation.h>
#import "SuNing.h"
#import "JingDong.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        id<Promotion> promotion=[[SuNing alloc]init];
        int money=[promotion initWithMouth:6 money:10000];
        NSLog(@"%d",money);
    }
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读