代理模式和备忘录模式

2018-12-17  本文已影响15人  Jason_YZC

代理模式

定义

代理模式(Proxy Pattern) :给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做ProxySurrogate,它是一种对象结构型模式

类图

代理模式

委托类

//.h

@protocol PersonDelegate <NSObject>

@required
- (void)eat:(int)clock;
- (void)run:(int)clock;

@end

@interface Person : NSObject

- (instancetype)initWithName:(NSString *)name;
@property (nonatomic, strong) id<PersonDelegate> deleagte;
- (void)wantToEatDinner:(int)clock;
- (void)wantToRun:(int)clock;

@end

//==================
//.m
@interface Person()

@property (nonatomic, copy) NSString *name;

@end

@implementation Person

- (instancetype)initWithName:(NSString *)name {
    if (self == [super init]) {
        self.name = name;
    }
    
    return self;
}

- (void)wantToEatDinner:(int)clock{
    NSLog(@"%@想%d出去吃饭",self.name,clock);
    if ([self.deleagte respondsToSelector:@selector(eat:)]) {  
        [self.deleagte eat:clock];
    }
}

- (void)wantToRun:(int)clock{
     NSLog(@"%@想%d出去跑步",self.name,clock);
    if ([self.deleagte respondsToSelector:@selector(run:)]) {
        [self.deleagte run:clock];
    }
}

@end

代理类

//.h
@interface Proxy : NSObject<PersonDelegate>

@end

//====
//.m
- (void)eat:(int)clock {
    NSLog(@"代理通知:%d点出去吃饭",clock);
}

- (void)run:(int)clock {
    NSLog(@"代理通知:%d点出去跑步",clock);
}

client

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Person *xiaoming = [[Person alloc] initWithName:@"小明"];
    Proxy *xiaohong = [[Proxy alloc] init];
    xiaoming.deleagte = xiaohong;
    [xiaoming wantToRun:5];
}

使用场景

在iOS下面的使用场景一般有界面反向传值,tableView的数据源,自定义cellcell点击事件,系统通知,系统方法回调等等。。。

优点

缺点


备忘录模式

定义

在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

使用场景

在iOS下面的使用场景一般有界面反向传值,tableView的数据源,自定义cellcell点击事件,系统通知,系统方法回调等等。。。

类图

Memo.h

#import <Foundation/Foundation.h>

@interface Memo : NSObject

/// 示例属性 -- 年龄
@property (nonatomic) NSInteger age;

/// 示例属性 -- 身高
@property (nonatomic) NSInteger height;
//User.h

#import <Foundation/Foundation.h>

@class Memo;
@interface User : NSObject

/// 示例属性 -- 姓名
@property (nonatomic, strong) NSString *name;

/// 示例属性 -- 年龄
@property (nonatomic) NSInteger age;

/// 示例属性 -- 身高
@property (nonatomic) NSInteger height;

#pragma mark - method 

/**
 保存备忘录
 */
- (Memo *)saveState;

/**
 从备忘录中恢复
 */
 
 //=======
// User.m

#import "User.h"
#import "Memo.h"

@implementation User

- (Memo *)saveState {
    Memo *m = [Memo new];
    m.age = _age;
    m.height = _height;
    return m;
}

- (void)recoverStateFromMemo:(Memo *)memo {
    _age = memo.age;
    _height = memo.height;
}
@end

使用

User *user = [User new];
    user.name = @"小明";
    user.age = 20;
    user.height = 178;
    NSMutableArray *memoArray = [NSMutableArray array];
    for (int i=0; i<10; i++) {
        [memoArray addObject:[user saveState]];
        user.age += 1;
        user.height += 0.8;
    }
    /// 恢复到25岁时候的状态
    [user recoverStateFromMemo:memoArray[5]];

用途

优点

缺点

上一篇下一篇

猜你喜欢

热点阅读