iOS App设计模式开发中策略模式的实现示例

这次介绍一下策略模式(Strategy Pattern),相比之下是一种比较简单的模式。它也叫政策模式(Policy Pattern)。 策略模式使用的就是面向对象的继承和多态机制,其他的没有什么玄机。策略模式适合使用在: 1. 多个类只有在算法或行为上稍有不同的场景。 2. 算法需要自由切换的场景。 3. 需要屏蔽算法规则的场景。 使用策略模式当然也有需要注意的地方,那么就是策略类不要太多,如果一个策略家族的具体策略数量超过4个,则需要考虑混合模式,解决策略类膨胀和对外暴露问题。在实际项目中,我们一般通过工厂方法模式来实现策略类的声明。

下面我们就来具体讲解一下策略模式。

策略模式定义:

Define a family of algorithms, encapsulate each one, and make them interchangeable.(定义一组算法,将每个算法都封装起来,并且是它们之间可以互换。)

下面我把策略模式的类层次结构图展示如下:

如图所示,Strategy类层次为Context定义了一系列的可供重用的算法和行为,继承有助于析取出这些算法中的公共功能。下面我用一个普通超市里收费的例子简单模拟了这个模式。我把其中对应的类介绍一下:

Context类———————————CashContext类
Strategy类———————————–CashSuper类
ConcreteStrategyA类—————-CashNormal类
ConcreteStrategyB类—————-CashRebate类
ConcreteStrategyC类—————-CashReturn类
好的,上面就是将要向大家展示的Objective C源代码类。

下面,我把上面对应的类展示出来,供大家参考:

注意:本文所有代码均在ARC环境下编译通过。

CashContext类接口

代码如下:

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

@interface CashContext :NSObject{
@private CashSuper *cs;
}
-(CashContext*)MyInit:(int)Types;
-(void)SetCashSuper:(CashSuper*)cashSuper;
-(double)GetResult:(double)money;
@end

CashContext类实现

代码如下:

#import "CashContext.h"
#import "CashNormal.h"
#import "CashRebate.h"
#import "CashReturn.h"

@implementation CashContext

-(CashContext*)MyInit:(int)Types{
    int myTypes;
    myTypes = Types;
    switch(myTypes) {
        case 1:
            [self SetCashSuper:[[CashNormalalloc]init]];
            break;
        case 2:
            [self SetCashSuper:[[CashReturnalloc]MyInit:300 And:100]];
            break;
        case 3:
            [self SetCashSuper:[[CashRebatealloc]MyInit:0.8]];
            break;
        default:
            break;
    }
    return self;
}
-(void)SetCashSuper:(CashSuper*)cashSuper{
    cs = cashSuper;
}
-(double)GetResult:(double)money{
    return [cs AcceptCash:money];
}

@end

CashSuper类接口

代码如下:

#import <Foundation/Foundation.h>

@interface CashSuper :NSObject
-(double)AcceptCash:(double)money;
@end

CashSuper类实现

代码如下:

#import"CashSuper.h"

@implementation CashSuper

-(double)AcceptCash:(double)money{
    return -1.0; //这里返回 -1.0无任何意义,只是为了定义此方法
}

@end

CashNormal类接口

代码如下:

#import"CashSuper.h"

@interface CashNormal :CashSuper
@end

CashNormal类实现

代码如下:

#import"CashNormal.h"

-(double)AcceptCash:(double)money{
    return money;
}

@end

CashRebate类接口

代码如下:

#import"CashSuper.h"

@interface CashRebate :CashSuper{
@private double moneyRebate;
}
@property double moneyRebate;
-(CashRebate*)MyInit:(double)moneyRebates;
@end

CashRebate实现

代码如下:

#import"CashRebate.h"

@implementation CashRebate
@synthesize moneyRebate;

-(CashRebate*)MyInit:(double)moneyRebates{
    [self setMoneyRebate:moneyRebates];
    return self;
}
-(double)AcceptCash:(double)money{
    return moneyRebate*money;
}

@end

CashReturn类接口

代码如下:

#import "CashSuper.h"

@interface CashReturn :CashSuper{
@private double moneyCondition;
@private double moneyReturn;
}
@property double moneyCondition;
@property double moneyReturn;
-(CashReturn*)MyInit:(double)moneyConditions And:(double)moneyReturns;
@end

CashReturn类实现

代码如下:

#import "CashReturn.h"

@implementation CashReturn
@synthesize moneyReturn;
@synthesize moneyCondition;

-(CashReturn*)MyInit:(double)moneyConditions  And:(double)moneyReturns{
    [self setMoneyReturn:moneyReturns];
    [self setMoneyCondition:moneyConditions];
    return self;
}
-(double)AcceptCash:(double)money{
    double result;
    result = money;
    @try{
        if(money >=moneyCondition){
            result = money - (money /moneyCondition)*moneyReturn;
        }
    }
    @catch(NSException *exception) {
        NSLog(@"Oh!Man!!CashReturn has something wrong!");
    }
    @finally{
        return result;
    }
}

@end

Main方法调用

代码如下:

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

int main (int argc, const char  *argv[])
{
    @autoreleasepool {
        CashContext *cc = [[CashContext alloc]MyInit:3];
        double total;
        total = [cc GetResult:400];
        NSLog(@"Total Money 400,the resual is %f", total);
    }
    return 0;
}

以上是对应的策略模式中相应的类,有一点需要声明的是,这些代码是在有ARC环境下书写的,所以不需要手动释放其中的资源。所以有些传递指针地方没有进行手动释放,在此解释一下。

什么情况下需要用策略模式呢,其实我的理解是,当我们在分析需求的过程中,需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。另外,策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

时间: 2016-03-28

实例解析设计模式中的外观模式在iOS App开发中的运用

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义 一个高层接口,这个接口使得这一子系统更加容易使用. 下面给大家展示一下类的结构图,想必大家一看就明白了: 其实这个模式中,没有类与类之间的继承关系,只是进行了简单的类引用,统一了对外的接口而已.看起来是不是很简单?废话不多说了,下面简单向大家展示一下代码吧! 注意:本文所有代码均在ARC环境下编译通过. SubSystemOne类接口 复制代码 代码如下: #import <Foundation/Foundation.

IOS开发中的设计模式汇总

iOS开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势:解耦合 敏捷原则:开放-封闭原则 实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求. 列表row个数delegate 自定义的delegate (二)观察者模式 应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布

深入解析设计模式中的装饰器模式在iOS应用开发中的实现

装饰器模式可以在不修改代码的情况下灵活的为一对象添加行为和职责.当你要修改一个被其它类包含的类的行为时,它可以代替子类化方法. 一.基本实现 下面我把类的结构图向大家展示如下: 让我们简单分析一下上面的结构图,Component是定义一个对象接口,可以给这些对象动态地添加职责.ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责.Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需

iOS App的设计模式开发中对State状态模式的运用

1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得"力不从心了".随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱.维护也会很麻烦.那么我就考虑只修改自身状态的模式. 例子1:按钮来控制一个电梯的状态,一个电梯开们,

iOS应用运用设计模式中的Strategy策略模式的开发实例

在写程序的时候,我们经常会碰到这样的场景:把一堆算法塞到同一段代码中,然后使用if-else或switch-case条件语句来决定要使用哪个算法?这些算法可能是一堆相似的类函数或方法,用以解决相关的问题.比如,一个验证输入数据的例程,数据本身可以是任何数据类型(如NSString.CGFloat等),每种数据类型需要不同的验证算法.如果能把每个算法封装成一个对象,那么就能消除根据数据类型决定使用什么算法的一堆if-else或switch-case语句. 我们把相关算法分离为不同的类,称为策略模式

iOS App设计模式开发中对迭代器模式的使用示例

何为迭代器模式? 迭代器提供了一种顺序访问集合对象中元素的方法,而无需暴漏结构的底层表示和细节.遍历集合中元素的职能从集合本身转移到迭代器对象.迭代器定义了一个用于访问集合元素并记录当前元素的接口.不同的迭代器可以执行不同的策略. 例子 说了这么多,下面给大家展示一下类关系图. 上图中Client的右边是迭代器,左边是具体迭代的类型,在迭代器内部对具体需要迭代的类型进行了引用,还算不难理解吧,呵呵.其实,看起来是为了对具体类型进行解耦.好啦,下面给出具体的代码实现,简单的模拟了迭代器模式. 注意

详解iOS应用的设计模式开发中Mediator中介者模式的使用

何为中介者模式? 面向对象的设计鼓励把行为分散到不同对象中,这种分散可能导致对象之间的相互关联.在最糟糕的情况下,所有对象都彼此了解并相互操作. 虽然把行为分散到不同对象增强了可复用性,但是增加的相互关联又减少了获得的益处.增加的关联使得对象很难或不能在不依赖其他对象的情况下工作.应用程序的整体行为可能难以进行任何重大修改,因为行为分布于许多对象.于是结果可能是创建越来越多的子类,以支持应用程序中的任何新行为. 中介者模式:用一个对象来封装一系列对象的交互方式.中介者使各对象不需要显式地相互引用

iOS App开发中使用设计模式中的单例模式的实例解析

一.单例的作用 顾名思义,单例,即是在整个项目中,这个类的对象只能被初始化一次.它的这种特性,可以广泛应用于某些需要全局共享的资源中,比如管理类,引擎类,也可以通过单例来实现传值.UIApplication.NSUserDefaults等都是IOS中的系统单例. 二.单例模式的两种写法 1,常用写法 #import "LGManagerCenter.h" static LGManagerCenter *managerCenter; @implementation LGManagerCe

JFrame中添加和设置JPanel的方法实例解析

Swing 程序用JFrame 对象实现了它们的窗口.JFrame 类是AWT Frame 类的一个子类.它还加入了一些Swing 所独有的特性.与 Frame 的使用十分相似.唯一的区别在于,你不能将组件加入到JFrame中.你可以或者将组件加入到JFrame 的content pane(内容面板) 中,或者提供一个新的content pane(内容面板). 面板与顶层容器的不同点:面板不能独立存在,必须被添加到其他容器内部(面板可以嵌套). JFrame 有一个 Content Pane,窗

iOS App开发中UIViewController类的使用教程

一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有条有理的展示在我们的View层上.iOS中的UIViewController是UIKit框架中最基本的一个类.从第一个UI视图到复杂完整项目,都离不开UIViewController作为基础.基于UIViewController的封装和扩展,也能够出色的完成各种复杂界面逻辑.这里旨在讨论UIViewController的生命周期和属性方法,在最基础的东西上,往往会

C++编程中使用设计模式中的policy策略模式的实例讲解

在看<C++设计新思维>的时候,发现在一开始就大篇幅的介绍策略模式(policy),策略模式不属于经典设计模式中的一种,但是其实在我们日常的开发中是必不可少的.policy,策略,方针,这里的意思是指把复杂功能的类尽量的拆分为功能单一的简单类的组合,简单的类只负责单纯行为或结构的某一方面.增加程序库的弹性,可复用性,可扩展性.policy是一个虚拟的概念,他定义了某一类class的一些接口规范,并不与C++语法的关键字对应,只是一个抽象的概念. 实例1: //policy模式的常见使用实例sm

举例讲解C#编程中对设计模式中的单例模式的运用

单例模式的介绍 说到单例模式,大家第一反应应该就是--什么是单例模式?,从"单例"字面意思上理解为--一个类只有一个实例,所以单例模式也就是保证一个类只有一个实例的一种实现方法罢了,下面给出单例模式的一个官方定义:确保一个类只有一个实例,并提供一个全局访问点.为了帮助大家更好地理解单例模式,大家可以结合下面的类图来进行理解,以及后面也会剖析单例模式的实现思路: 为什么会有单例模式 看完单例模式的介绍,自然大家都会有这样一个疑问--为什么要有单例模式的?它在什么情况下使用的?从单例模式的

C#编程中使用设计模式中的原型模式的实例讲解

一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在内存中分配了多个一样的类实例对象,然后如果采用工厂模式来创建这样的系统的话,随着产品类的不断增加,导致子类的数量不断增多,反而增加了系统复杂程度,所以在这里使用工厂模式来封装类创建过程并不合适,然而原型模式可以很好地解决这个问题,因为每个类实例都是相同的,当我们需要多个相同的类实例时,没必要每次都使

Python中的random.uniform()函数教程与实例解析

random.uniform( ) 函数教程与实例解析 1. uniform( ) 函数说明 random.uniform(x, y)方法将随机生成一个实数,它在 [x,y] 范围内. 2. uniform( ) 的语法与参数 2.1 语法 # _*_ coding: utf-8 _*_ import random random.uniform(x, y) 或 # _*_ coding: utf-8 _*_ from random import uniform uniform(x, y) 提示:

实例讲解设计模式中的命令模式在iOS App开发中的运用

命令模式封装一个请求或行为作为一个对象.封装的请求比原的更加灵活,可以在对象之间传递,储存,动态修改,或放入一个队列. 那么让我们简要的说一下命令模式的特点. 它能比较容易地设计一个命令队列: 在需要的情况下,可以较容易地将命令记入日志: 允许接收请求地一方决定是否要否决请求: 可以容易地实现对请求地撤销和重做: 由于加进新地具体命令类不影响其他的类,因此增加新的具体命令类很容易: 把请求一个操作的对象与知道怎么执行一个操作的对象分隔开. 下面给出基本的类结构图: 上面这张图是命令模式的类结构的

设计模式中的Memento备忘录模式的在iOS App开发中的运用

备忘录模式.顾名思义,备忘录模式的初衷就是为了返回上一个状态而设计的.从名字看起来一目了然,好吧,还是老样子,先给出定义. 备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 定义看起来搞的很专业,其实就是保存上一个状态,以便日后恢复用.好比是在玩游戏,在打大Boss之前担心第一次打不过,先存个盘,万一玩儿完了,还可以恢复状态重新PK. 下面给出类结构图. Originator(原发器):记录当前时刻的