美文网首页
代理模式和备忘录模式

代理模式和备忘录模式

作者: Jason_YZC | 来源:发表于2018-12-17 10:33 被阅读15次

    代理模式

    定义

    代理模式(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]];
    
    

    用途

    • 用于存储状态

    优点

    • 将被储存的状态放在外面,不要和关联对象混在一起,这可以帮助维护内聚
    • 保持关联对象的数据封装
    • 提供了容易实现的恢复能力

    缺点

    • 储存和恢复状态的过程可能相当耗时

    相关文章

      网友评论

          本文标题:代理模式和备忘录模式

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