设计模式:性能与对象访问(享元,代理) :对象状态(备忘录)
2017-05-12 13:46
886 查看
七、性能与对象访问
20、享元模式(Flyweight pattern):运用共享技术有效地支持大量细粒度的对象。在面向对象软件设计中,利用公共对象不仅能节省资源还能提高性能。共享的对象只能提供某些内在的信息,而不能用来识别对象,这是专门用于设计可共享对象的一种设计模式。实现享元模式需要两个关键组件,通常是可共享的享元对象和保存他们的池。某种中央对象维护这个池,并从它返回适当的实例。
下面实例中用到工厂方法创建了网站类,共用了flyweights 对象,根据不同网站对象的具体特征(网名,登录用户)添加了不同的键值对。
在 "WebSiteFactory.h" 中
在WebSiteFactory.m中
21、代理模式:为其它对象提供一种代理以控制对这个对象的访问。(远程代理,虚拟代理,保护代理,智能引用代理)
代理设计当中,包含了存储在内存中的代理协议机制和在储存在磁盘当中的图像二值数据。
继续20. 享元模式的实例:
该协议:
#import <Foundation/Foundation.h>
#import "User.h"
@protocol WebSiteProtocol <NSObject>
- (void)user:(User *)user;
@end
通过ConcreteWebSite对象类 遵守 WebSiteProtocol 委托代理协议 来实现代理方法,访问 User对象类属性和方法
#import <Foundation/Foundation.h>
#import "WebSiteProtocol.h"
@interface ConcreteWebSite : NSObject<WebSiteProtocol>
@property(nonatomic,copy)NSString *webName;
@end
#import <Foundation/Foundation.h>
@interface User : NSObject
@property(nonatomic,copy)NSString *userName;
@end
在VC 中就可以通过共享对象 来创建实例,调用具体方法,提高性能:
- (void)dealData{
//工厂方法返回 各种具体享元对象,维护池中的享元对象
WebSiteFactory *factory =[[WebSiteFactory alloc] init];
//返回具体享元对象
WebsiteType type1 =[factory getWebSiteCategory:@"首页"];
User *user1 =[[User alloc] init];
user1.userName =@"庄子";
//享元对象都具有use方法
[type1 user:user1];
WebsiteType type2 =[factory getWebSiteCategory:@"商店"];
User *user2 =[[User alloc] init];
user2.userName =@"老子";
//享元对象都具有use方法
[type2 user:user2];
NSInteger count =[factory getWebSiteCount];
ZXLog(@"个数:%ld",(long)count);
}
八、对象状态
22、备忘录:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。
就是保存当前上下文的复杂状态的快照并在以后恢复。
在归档(architecturer)、属性列表序列化和核心数据 中采用了备忘录模式。
(归档:是对 对象及其属性还有同其他对象间的关系进行编码,形成一个文档,该文档即可保存于文件系统,也可在进程或网络间传递。归档过程 是把对象图(对象与其他对象的关系)保存为一种与架构无关的字节流,保存对象的标识以及对象之间的关系。从字节流解码出来的对象通常用与对象编码时相同的类进行实例化。)
20、享元模式(Flyweight pattern):运用共享技术有效地支持大量细粒度的对象。在面向对象软件设计中,利用公共对象不仅能节省资源还能提高性能。共享的对象只能提供某些内在的信息,而不能用来识别对象,这是专门用于设计可共享对象的一种设计模式。实现享元模式需要两个关键组件,通常是可共享的享元对象和保存他们的池。某种中央对象维护这个池,并从它返回适当的实例。
下面实例中用到工厂方法创建了网站类,共用了flyweights 对象,根据不同网站对象的具体特征(网名,登录用户)添加了不同的键值对。
在 "WebSiteFactory.h" 中
#import <Foundation/Foundation.h> #import "WebSiteProtocol.h" //享元:工厂类,维护池中的享元对象 @interface WebSiteFactory : NSObject @property(nonatomic,strong)NSDictionary *flyweights;//享元对象 //getWebSiteCategory方法可以返回具体的享元对象,返回的这个享元对象同时遵守WebSiteProtocol的协议 - (id<WebSiteProtocol>)getWebSiteCategory:(NSString *)webKey; @end
在WebSiteFactory.m中
- (id<WebSiteProtocol>)getWebSiteCategory:(NSString *)webKey{ __block id<WebSiteProtocol> webset =nil; [self.flyweights enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { if (webKey ==key) { webset =obj; *stop =YES; } }]; if (webset ==nil) { ConcreteWebSite *concreteWebset =[[ConcreteWebSite alloc] init]; concreteWebset.webName =webKey; webset =concreteWebset; //将不可变字典self.flyweights 转成可变后,添加键值对 后 再 变成不可变的NSDictionary NSMutableDictionary *mutabledic =[NSMutableDictionary dictionaryWithDictionary:self.flyweights]; [mutabledic setObject:webset forKey:webKey]; self.flyweights =[NSDictionary dictionaryWithDictionary:mutabledic]; } return webset; }
21、代理模式:为其它对象提供一种代理以控制对这个对象的访问。(远程代理,虚拟代理,保护代理,智能引用代理)
代理设计当中,包含了存储在内存中的代理协议机制和在储存在磁盘当中的图像二值数据。
继续20. 享元模式的实例:
该协议:
#import <Foundation/Foundation.h>
#import "User.h"
@protocol WebSiteProtocol <NSObject>
- (void)user:(User *)user;
@end
通过ConcreteWebSite对象类 遵守 WebSiteProtocol 委托代理协议 来实现代理方法,访问 User对象类属性和方法
#import <Foundation/Foundation.h>
#import "WebSiteProtocol.h"
@interface ConcreteWebSite : NSObject<WebSiteProtocol>
@property(nonatomic,copy)NSString *webName;
@end
#import "ConcreteWebSite.h" @implementation ConcreteWebSite - (void)user:(User *)user{ ZXLog(@"在 %@网站 有用户名:%@的用户登录",self.webName,user.userName); } @end
#import <Foundation/Foundation.h>
@interface User : NSObject
@property(nonatomic,copy)NSString *userName;
@end
在VC 中就可以通过共享对象 来创建实例,调用具体方法,提高性能:
- (void)dealData{
//工厂方法返回 各种具体享元对象,维护池中的享元对象
WebSiteFactory *factory =[[WebSiteFactory alloc] init];
//返回具体享元对象
WebsiteType type1 =[factory getWebSiteCategory:@"首页"];
User *user1 =[[User alloc] init];
user1.userName =@"庄子";
//享元对象都具有use方法
[type1 user:user1];
WebsiteType type2 =[factory getWebSiteCategory:@"商店"];
User *user2 =[[User alloc] init];
user2.userName =@"老子";
//享元对象都具有use方法
[type2 user:user2];
NSInteger count =[factory getWebSiteCount];
ZXLog(@"个数:%ld",(long)count);
}
八、对象状态
22、备忘录:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。
就是保存当前上下文的复杂状态的快照并在以后恢复。
在归档(architecturer)、属性列表序列化和核心数据 中采用了备忘录模式。
(归档:是对 对象及其属性还有同其他对象间的关系进行编码,形成一个文档,该文档即可保存于文件系统,也可在进程或网络间传递。归档过程 是把对象图(对象与其他对象的关系)保存为一种与架构无关的字节流,保存对象的标识以及对象之间的关系。从字节流解码出来的对象通常用与对象编码时相同的类进行实例化。)
相关文章推荐
- 单例设计模式 (应用场景,存储一些共享信息,每个对象都能访问修改.某类的创建非常消耗性能,设计成单例,提高性能)
- 设计模式(2)_代理模式 ————— 控制对象访问
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 控制对象访问--代理模式
- 结构型模式01-代理模式(为其他对象提供一种代理以控制这个对象的访问)
- java 程序性能优化《第二章》设计优化 2.1善用设计模式 2 代理模式
- 代理模式 -- 通过代理对象间接访问对象
- 设计模式二十二:state(状态模式)——对象行为型模式
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 代理模式 -- 通过代理对象间接访问对象
- C#面向对象模式设计第二十二讲:State 状态模式(行为型模式)
- "围观"设计模式(31)--行为型设计模式总结(模板、观察者、策略、状态、责任链、命令、访问者、中介者、备忘录、解释器)
- PHP设计模式之适配器模式,建造者模式,数据访问对象模式
- 【编程素质】设计模式-代理模式(委托模式、Proxy Pattern):动态扩充对象功能
- 控制对对象的访问——代理模式详解(静态代理和动态代理的区别以及联系)
- PHP设计模式 数据访问对象模式
- 设计模式之代理(Proxy)----对象结构型模式
- 设计模式知识连载(39)---数据访问对象模式---本地存储DAO
- 设计模式学习笔记--数据访问对象模式
- 设计模式【2】-对象行为型-状态模式