美文网首页
IOS策略模式和多态

IOS策略模式和多态

作者: 枫叶1234 | 来源:发表于2018-05-07 13:40 被阅读76次

    策略模式是一种常见的软件设计模式,这里简单得介绍一下策略模式并用IOS简单实现一下。
    所谓的策略模式,顾名思义是要采用不同的策略的。一般来说,在不同的情况下,处理某一个问题的方法也不一样。比如说对字符串的排序和对数字的排序,虽然用的都是快排,但是显然不可能使用一段通用的代码。有人说java里面的compareTo可以做到,但如果考虑这么一个问题:同样是出门旅行,老年人身体虚弱,需要大量的休息,而孩子则是精力充沛,希望玩到更多的景点。如何在同一模式下表达以上信息、采用合理的设计模式进行封装而不是大量重写类似的代码,就需要学习并采用策略模式。
    首先建立一个通用的策略,这里直接命名为Strategy。这个类是最终暴露出来,需要被调用的类。

    //Strategy.h
    #import <Foundation/Foundation.h>
    @interface Strategy : NSObject
    - (void) go;
    @end
    
    //Strategy.m
    #import "Strategy.h"
    @implementation Strategy
    - (void)go{
        NSLog(@"I am going outside");
    }
    @end
    

    .m方法里并没有过多的实现go方法,可以看到只写了一个NSLog,其实也完全可以不写。这个类有点接近于java中的interface和C++中的纯虚类。因为这个是一个通用的,暴露出来的接口,所以具体的实现并不需要在strategy类中的go方法内完成。
    接下来定义两个类,分别继承自Strategy类,这两个类中包含了具体的方法实现,是功能的主体部分。

    //OldPeopleTravel.h
    #import <Foundation/Foundation.h>
    #import "Strategy.h"
    @interface OldPeopleTravel : Strategy
    - (void) go;
    @end
    

    .m文件里是具体的针对对老年人的实现方法

    //OldPeopleTravel.h
    #import "OldPeopleTravel.h"
    @implementation OldPeopleTravel
    
    -(void)go{
        [super go];
        NSLog(@"I am old, I need rest");
    }
    
    @end
    

    类似的还有YoungPeopleTravel的.h和.m文件

    //YoungPeopleTravel.h
    #import "Strategy.h"
    
    @interface YoungPeopleTravel : Strategy
    
    - (void) go;
    
    @end
    
    //YoungPeopleTravel.m
    #import "YoungPeopleTravel.h"
    
    @implementation YoungPeopleTravel
    
    - (void) go{
        [super go];
        NSLog(@"I am young, I am energetic");
    }
    
    @end
    

    以上是策略类和具体的实现类的实现,接下来就是调用这个策略了。

    //ViewController.m
    #import "ViewController.h"
    #import "Strategy.h"
    #import "OldPeopleTravel.h"
    #import "YoungPeopleTravel.h"
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self goOutside:[[OldPeopleTravel alloc]init]];
        [self goOutside:[[YoungPeopleTravel alloc]init]];
    }
    
    - (void)goOutside:(id)theStrategy{
        Strategy *strategy = theStrategy;
        [strategy go];
    }
    
    @end
    

    可以看到,最终我们调用的是自己的goOutside方法,方法中有一个参数是strategy,通过传入不同的参数(策略),就可以调用这个策略下具体的方法实现。运行结果表示策略模式已经成功的实现了。通过调用不同的策略,得到了不同的处理结果。

    相关文章

      网友评论

          本文标题:IOS策略模式和多态

          本文链接:https://www.haomeiwen.com/subject/waymrftx.html