iOS常用设计模式——命令设计模式

命令设计模式详解

  • 命令设计模式详解

    • 基本概念
    • NSInvocation的使用
    • 命令模式的体现

基本概念

命令设计模式将一个请求或行动作封装为对象。这个封装请求比原始的请求要灵活并且可以在对象之前被传递,存储,动态修改或者放进队列里面。苹果公司实现这种模式使用Target-Action机制和Invocation。

NSInvocation的使用

在 iOS中可以直接调用 某个对象的消息 方式有2种

一种是performSelector:withObject:再一种就是NSInvocation第一种方式比较简单,能完成简单的调用。但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定。那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作

NSInvocation可以处理参数、返回值。会java的人都知道反射操作,其实NSInvocation就相当于反射操作。

int main (int argc, const char * argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    MyClass *myClass = [[MyClass alloc] init];
    NSString *myString = @"My string";

    //普通调用
    NSString *normalInvokeString = [myClass appendMyString:myString];
    NSLog(@"The normal invoke string is: %@", normalInvokeString);

    //NSInvocation调用
    SEL mySelector = @selector(appendMyString:);
    NSMethodSignature * sig = [[myClass class]                        instanceMethodSignatureForSelector: mySelector];

    NSInvocation * myInvocation = [NSInvocation invocationWithMethodSignature: sig];
    [myInvocation setTarget: myClass];
    [myInvocation setSelector: mySelector];
    [myInvocation setArgument: &myString atIndex: 2];
    NSString * result = nil;
    [myInvocation retainArguments];
    [myInvocation invoke];
    [myInvocation getReturnValue: &result];
    NSLog(@"The NSInvocation invoke string is: %@", result);
    [myClass release];
    [pool drain];
    return 0;
}
MyClass.h
#import <Foundation/Foundation.h>
@interface MyClass : NSObject {
}
- (NSString *)appendMyString:(NSString *)string;
@end
MyClass.m

#import "MyClass.h"

@implementation MyClass

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

- (NSString *)appendMyString:(NSString *)string
{
    NSString *mString = [NSString stringWithFormat:@"%@ after append method", string];

    return mString;
}

- (void)dealloc
{
    [super dealloc];
}
@end

这里说明一下[myInvocation setArgument: &myString atIndex: 2];为什么index从2开始 ,原因为:0 1 两个参数已经被target 和selector占用。

命令模式的体现


    NSMethodSignature *sig = [self methodSignatureForSelector:@selector(addAlbum:atIndex:)];   

    NSInvocation *undoAction = [NSInvocationinvocationWithMethodSignature:sig];   

    [undoAction setTarget:self];   

    [undoAction setSelector:@selector(addAlbum:atIndex:)];   

    [undoAction setArgument:&deletedAlbum atIndex:2];   

    [undoAction setArgument:&currentAlbumIndex atIndex:3];   

    [undoAction retainArguments];
    [undoStack addObject:undoAction];  

 - (void)undoAction
{
    if (undoStack.count > 0)
    {
        NSInvocation *undoAction = [undoStack lastObject];
        [undoStack removeLastObject];
        [undoAction invoke];
    }
}
撤销操作弹出栈顶的NSInvocation对象,然后通过invoke调用它
时间: 2024-10-17 12:53:07

iOS常用设计模式——命令设计模式的相关文章

iOS.常用设计模式.02.委托模式

WTDelegate #import <Foundation/Foundation.h> @protocol WTDelegate <NSObject> @required - (void)sleep; - (void)eat; - (void)work; @end WTPhilosopher.h #import <Foundation/Foundation.h> #import "WTDelegate.h" @interface WTPhiloso

iOS.常用设计模式.01.单例模式

使用单例模式的类: UIApplication UIAccelerometer NSUserDefaults NSNotificationCenter NSFileManager NSBundle等 Singleton.h #import <Foundation/Foundation.h> @interface Singleton : NSObject // 始终返回同一个Singleton的指针 + (Singleton *)sharedManager; @property (strong,

IOS常用设计模式——单例模式(IOS开发)

IOS常用的设计模式包括:单例模式.委托模式.观察者模式和MVC模式. 这里主要讲单例模式 单例模式 -问题: 主要解决应用中只有一个实例的问题(只需要某个类的实例) -原理:一般会封装一个静态属性,并提供静态实例的创建方法 -应用:单例类 // Singleton.h @interface Singleton : NSObject + (Singleton *)sharedManager; @property (nonatomic, strong) NSString* stingletonDa

iOS常用设计模式——单例设计模式

单例设计模式详解 单例设计模式详解 基本概念 在IOS中使用单例模式的情况 非ARC环境创建单例模式的基本步骤 非ARC环境具体代码实现 ARC环境创建单例模式的基本步骤 基本概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问 在IOS中使用单例模式的情况 1.如果说创建一个对象会耗费很多系统资源,那么此时采用单例模式,因为只需要一个实例,会节省alloc的时间 2.在IOS开发中,如果很多模

iOS常用设计模式——单例模式

第一部分: 创建一个单例对象 单例的应用场景: 单例模式用于当一个类只能有一个实例的时候, 通常情况下这个"单例"代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据.用单例模式加以控制是非常有必要的. 什么是单例模式? 单例是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为. 单例设计模式需要达到下面几个目的:1.

iOS中都有什么设计模式?各个设计模式的作用 (转载)

原文地址: http://www.cnblogs.com/dxb123456/p/5479198.html 一  iOS中都有什么设计模式? 1.代理模式 2.观察者模式 3.MVC模式 4.单例模式 5.策略模式 6.工厂模式 二  各个设计模式的作用? (一)代理模式 在观察者模式中,一个对象任何状态的变更都会通知另外的对改变感兴趣的对象.这些对象之间不需要知道彼此的存在,这其实是一种松耦合的设计.当某个属性变化的时候,我们通常使用这个模式去通知其它对象. 此模式的通用实现中,观察者注册自己

iOS中都有什么设计模式?各个设计模式的作用?

一  iOS中都有什么设计模式? 1.代理模式 2.观察者模式 3.MVC模式 4.单例模式 5.策略模式 6.工厂模式 二  各个设计模式的作用? (一)代理模式 在观察者模式中,一个对象任何状态的变更都会通知另外的对改变感兴趣的对象.这些对象之间不需要知道彼此的存在,这其实是一种松耦合的设计.当某个属性变化的时候,我们通常使用这个模式去通知其它对象. 此模式的通用实现中,观察者注册自己感兴趣的其它对象的状态变更事件.当状态发生变化的时候,所有的观察者都会得到通知.苹果的推送通知(Push N

iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)

关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. 首先得搞清楚设计模式是个什么鬼,在软件设计领域,设计模式是对通用问题的可复用的解决方案.设计模式是一系列帮你写出更可理解和复用代码的模板,设计模式帮你创建松耦合的代码以便你不需要费多大力就可以改变或者替换代码中的组件 其实iOS中的设计模式有非常多,常用的就下面这四种 一.MVC设计模式(设计模式

常用的android设计模式

一般来说,常用的android设计模式有以下8种:单例.工厂.观察者.代理.命令.适配器.合成.访问者. 单例模式:目的是为了让系统中只有一个调用对象,缺点是单例使其他程序过分依赖它,而且不同单例运行在不同进程中,使得维护困难: 工厂模式:生产固定的一些东西,如抽象类,缺点是产品修改麻烦:如喜欢动作片和爱情片的人分别向服务器发出同一个请求,就可以得到他们想看的影片集,相当于不同对象进行同一请求,需求均得到满足. 观察者模式:就是多个对象对一个对象进行监控,如缓存: 代理模式:自己的事交给别人去做