zoukankan      html  css  js  c++  java
  • iOS开发-策略模式

    策略(Strategy)模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。看到策略模式的时候有的时候跟简单工厂相比较,其实有很大的迷惑性,都是继承多态感觉没有太大的差异性,简单工厂模式是对对象的管理,策略模式是对行为的封装。可以先简单的看一下结构图:

    之前简单工厂是通过银行卡作为例子的简单工厂将不同的银行卡抽象出来,如果在策略模式中我们可以将每张银行卡的购物,吃饭,住房。。作为一个简单的消费策略抽象出来,也可以以操作系统类比,Windows,OS X,Linux可以作为简单的对象抽象,系统中都是有默认软件的,我们不需要管软件的安装,如果没有软件的话我们就需要自己下载,可以将软件的安装作为一个策略封装起来。

    Strategy的抽象类:

    @interface SoftWareStrategy : NSObject
    
    -(void)installStrategy;
    
    @end

    继承Strategy的Xcode的策略类:

    @implementation XcodeStrategy
    
    -(void)installStrategy{
        NSLog(@"Xcode安装成功");
    }
    
    @end
    

    继承Strategy的QQ的策略类:

    @implementation QQStrategy
    
    -(void)installStrategy{
        NSLog(@"QQ安装成功");
        NSLog(@"原文地址:http://www.cnblogs.com/xiaofeixiang");
    }
    
    @end
    

    Context类:

    typedef NS_OPTIONS(NSInteger, StrategyType){
        StrategyXcode,
        strategyQQ
    };
    
    @interface SoftWareContext : NSObject
    
    -(instancetype)initWithStrategyType:(StrategyType)strategyType;
    
    -(void)installResult;
    
    @end
    

    Context的实现:

    @interface  SoftWareContext()
    
    @property  (strong,nonatomic) SoftWareStrategy *strategy;
    
    @end
    @implementation SoftWareContext
    
    -(instancetype)initWithStrategyType:(StrategyType)strategyType{
        self=[super init];
        if (self) {
            switch (strategyType) {
                case StrategyXcode:
                    self.strategy=[[XcodeStrategy alloc]init];
                    break;
                case strategyQQ:
                    self.strategy=[[QQStrategy alloc]init];
                    break;
            }
        }
        return self;
    }
    
    -(void)installResult{
        [self.strategy installStrategy];
    }
    
    @end
    

    最终调用:

        SoftWareContext  *context=[[SoftWareContext alloc]initWithStrategyType:StrategyXcode];
        [context installResult];
    

    这里有三个概念再看一下应该就清晰多了:

    环境(Context)角色:持有一个Strategy的引用;

    抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口;

    具体策略(ConcreteStrategy)角色:包装了相关的算法或行为; 

  • 相关阅读:
    偶对学习C#以及理解.Net平台的一些看法(二,Junior Bibliography)
    聊聊编程那些破事0.Prehistory
    偶对学习C#以及理解.Net平台的一些看法(一,Prerequisites)
    [转帖]c#.net常用函数列表
    一个编程小题目引发的思考(上)
    geoTools学习笔记001(简介)
    ArcGIS Server 10安装配置(JAVA)
    ARCGIS中label(标注)和Annotation(注记
    JSTL入门开发包详解
    基于C/S的网盘设计(JAVA) 网盘源码实现部分功能
  • 原文地址:https://www.cnblogs.com/xiaofeixiang/p/4719566.html
Copyright © 2011-2022 走看看