• iOS原型模式


    原型模式:大部分重复,只有一小部分不同的情况下,为了代码清晰和避免麻烦,用原型模式,会更方便一点

        // 学生1
        StudentModel *stu1 = [[StudentModel alloc] init];
        stu1.name          = @"小王";
        stu1.age           = @(19);
        stu1.address       = @"中关村";
        stu1.totalScore    = @(100);
        
        // 学生2
        StudentModel *stu2 = [[StudentModel alloc] init];
        stu2.name          = @"小红";
        stu2.age           = @(19);
        stu2.address       = @"中关村";
        stu2.totalScore    = @(100);

    例如上面这个,只有名字不同,所以实现copy方法。

    #import <Foundation/Foundation.h>
    
    @protocol ProtoypeCopyProtocol <NSObject>
    
    @required
    
    /**
     *  复制自己
     *
     *  @return 返回一个拷贝样本
     */
    - (id)clone;
    
    @end
    #import <Foundation/Foundation.h>
    #import "ProtoypeCopyProtocol.h"
    
    @interface StudentModel : NSObject <ProtoypeCopyProtocol>
    
    @property (nonatomic, strong) NSString  *name;
    @property (nonatomic, strong) NSNumber  *age;
    @property (nonatomic, strong) NSString  *address;
    @property (nonatomic, strong) NSNumber  *totalScore;
    
    - (id)clone;
    
    @end
    #import "StudentModel.h"
    
    @implementation StudentModel
    
    - (id)clone {
    
        StudentModel *student = [[[self class] alloc] init];
        
        // 完成复杂操作的所有作业
        student.name       = self.name;
        student.age        = self.age;
        student.address    = self.address;
        student.totalScore = self.totalScore;
        
        return student;
    }
    
    @end

    重写了clone方法,将复杂的操作写在里面。

    关于深拷贝和浅拷贝:

    创建BaseCopyObject

    #import <Foundation/Foundation.h>
    
    @interface BasCopyObject : NSObject <NSCopying>
    
    /**
     *  == 子类不要重载 ==
     *
     *  @return 复制的对象
     */
    - (id)copyWithZone:(NSZone *)zone;
    
    /**
     *  == 由子类重载实现 ==
     *
     *  复制(赋值操作)
     *
     *  @param object 已经复制的对象
     */
    - (void)copyOperationWithObject:(id)object;
    
    @end
    #import "BasCopyObject.h"
    
    @implementation BasCopyObject
    
    - (id)copyWithZone:(NSZone *)zone {
    
        BasCopyObject *copyObject = [[self class] allocWithZone:zone];
        
        // 赋值操作作业
        [self copyOperationWithObject:copyObject];
        
        return copyObject;
    }
    
    - (void)copyOperationWithObject:(id)object {
    
    }
    
    @end

    创建StudentModel,重写copyOperationWithObject方法,继承于StudentModel

    #import "BasCopyObject.h"
    
    @interface StudentModel : BasCopyObject
    
    @property (nonatomic, strong) NSString *name;
    @property (nonatomic, strong) NSNumber *age;
    
    @end
    #import "StudentModel.h"
    
    @implementation StudentModel
    
    - (void)copyOperationWithObject:(StudentModel *)object {
        
        object.name = self.name;
        object.age  = self.age;
    }
    
    @end

    在viewDidLoad里面实现:

      StudentModel *stu1 = [[StudentModel alloc] init];
        stu1.name          = @"小明";
        
        StudentModel *stu2 = stu1.copy;

    实现浅拷贝,实现原型模式,更方便。可以打印地址,地址不同,已经完全复制了。

    在创建ClassModel:

    #import "BasCopyObject.h"
    
    @interface ClassModel : BasCopyObject
    
    @property (nonatomic, strong) NSString  *className;
    @property (nonatomic, strong) NSArray   *students;
    
    @end
    #import "ClassModel.h"
    
    @implementation ClassModel
    
    - (void)copyOperationWithObject:(ClassModel *)object {
    
        object.className = self.className;
        
        // 完成了深拷贝(完整的复制了集合里面的对象)
        object.students  = [[NSArray alloc] initWithArray:self.students copyItems:YES];
    }
    
    @end

    必须完成上面的这种深拷贝操作才能完成students里面stu的完全拷贝,如果用简单的object.students = self.students;只能完成浅拷贝,当一班的人改变了二班的人也会改变。

    以上就是原型模式,适合在一个model里面出现了许多的属性,太少的话,就没有必要了。

  • 相关阅读:
    Twitter注册
    iOS项目的完整重命名方法图文教程
    加载gif动态图的三种方式
    只 一行显示可左右滚动的文本(UITextField中文限制)
    iOS学习资料链接
    GCD常用方法
    移动端轮播完整版css3加原生写法
    zepto-touch.js插件
    移动端续讲及zepto移动端插件外加touch插件介绍
    解决ios和Android的差异
  • 原文地址:https://www.cnblogs.com/beijingxiaoguo/p/4792024.html
Copyright © 2020-2023  润新知