策略

iOS设计模式 - 策略

原理图

Strategy.png

说明

  • 把解决相同问题的算法抽象成策略(相同问题指的是输入参数相同,但根据算法不同输出参数会有差异).
  • 策略被封装在对象之中(是对象内容的一部分),策略改变的是对象的内容.
  • 策略模式可以简化复杂的判断逻辑(if - else).

代码实现

人的出行旅游方式有很多种, 即拥有不同的出行策略, 通过选择不同的策略来实现不同的出行方式而不用关心具体的策略实现方式

抽象的策略类

//
//  TravelStrategy.h
//  Strategy
//
//  Created by mye on 2019/3/7.
//  Copyright © 2019 mye. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface TravelStrategy : NSObject

/**
 出行方式
 */
- (void)travelAlgorithm;

@end

NS_ASSUME_NONNULL_END

//
//  TravelStrategy.m
//  Strategy
//
//  Created by mye on 2019/3/7.
//  Copyright © 2019 mye. All rights reserved.
//

#import "TravelStrategy.h"

@implementation TravelStrategy

- (void)travelAlgorithm {
    
}

@end


具体的策略

//
//  AirPlanelStrategy.h
//  Strategy
//
//  Created by mye on 2019/3/7.
//  Copyright © 2019 mye. All rights reserved.
//

#import "TravelStrategy.h"

NS_ASSUME_NONNULL_BEGIN

@interface AirPlanelStrategy : TravelStrategy

@end

NS_ASSUME_NONNULL_END

//
//  AirPlanelStrategy.m
//  Strategy
//
//  Created by mye on 2019/3/7.
//  Copyright © 2019 mye. All rights reserved.
//

#import "AirPlanelStrategy.h"

@implementation AirPlanelStrategy

- (void)travelAlgorithm {
    NSLog(@"travelbyAirPlain");
}

@end

//
//  TrainStrategy.h
//  Strategy
//
//  Created by mye on 2019/3/7.
//  Copyright © 2019 mye. All rights reserved.
//

#import "TravelStrategy.h"

NS_ASSUME_NONNULL_BEGIN

@interface TrainStrategy : TravelStrategy

@end

NS_ASSUME_NONNULL_END

//
//  TrainStrategy.m
//  Strategy
//
//  Created by mye on 2019/3/7.
//  Copyright © 2019 mye. All rights reserved.
//

#import "TrainStrategy.h"

@implementation TrainStrategy

- (void)travelAlgorithm {
    NSLog(@"travelbyTrain");
}

@end

//
//  BicycleStrategy.h
//  Strategy
//
//  Created by mye on 2019/3/7.
//  Copyright © 2019 mye. All rights reserved.
//

#import "TravelStrategy.h"

NS_ASSUME_NONNULL_BEGIN

@interface BicycleStrategy : TravelStrategy

@end

NS_ASSUME_NONNULL_END

//
//  BicycleStrategy.m
//  Strategy
//
//  Created by mye on 2019/3/7.
//  Copyright © 2019 mye. All rights reserved.
//

#import "BicycleStrategy.h"

@implementation BicycleStrategy

- (void)travelAlgorithm {
    NSLog(@"travelbyBicycle");
}

@end

人持有策略对象

//
//  Person.h
//  Strategy
//
//  Created by mye on 2019/3/7.
//  Copyright © 2019 mye. All rights reserved.
//

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

NS_ASSUME_NONNULL_BEGIN

@interface Person : NSObject

@property (nonatomic, strong) TravelStrategy *travelStrategy;

@end

NS_ASSUME_NONNULL_END

通过选择不同的策略来实现不同的出行方式而不用关心具体的策略实现方式

//
//  ViewController.m
//  Strategy
//
//  Created by mye on 2019/3/7.
//  Copyright © 2019 mye. All rights reserved.
//

#import "ViewController.h"
#import "TravelStrategy.h"
#import "AirPlanelStrategy.h"
#import "TrainStrategy.h"
#import "BicycleStrategy.h"
#import "Person.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    TravelStrategy *travelStrategy = [[AirPlanelStrategy alloc] init];
    Person *p = [[Person alloc] init];
    
    // 1. 坐飞机旅行
    p.travelStrategy = travelStrategy;
    [p.travelStrategy travelAlgorithm];
    
    // 2. 坐火车旅行
    travelStrategy = [[TrainStrategy alloc] init];
    p.travelStrategy = travelStrategy;
    [p.travelStrategy travelAlgorithm];
    
    // 3. 骑自行车旅行
    travelStrategy = [[BicycleStrategy alloc] init];
    p.travelStrategy = travelStrategy;
    [p.travelStrategy travelAlgorithm];
}


@end

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【学习难度:★☆☆☆☆,使用频率:★★★★☆】直接出处:策略模式梳理和学习:https://github.com/...
    BruceOuyang阅读 5,418评论 3 5
  • 1.初识策略模式 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户...
    王侦阅读 5,317评论 0 3
  • 目录 本文的结构如下: 引言 什么是策略模式 模式的结构 典型代码 代码示例 策略模式和模板方法模式的区别 优点和...
    w1992wishes阅读 4,357评论 1 7
  • 二十三种设计模式 - 策略模式 策略模式简介 模式动机 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个...
    JustTheSame阅读 5,797评论 2 16
  • 通过面向对象的封装,继承和多态来降低程序的耦合度。下面就让我们来深入学习这个模式。 工厂模式:客户类和工厂类分开。...
    linbj阅读 4,643评论 0 0