您的位置:首页 > 其它

设计模式:性能与对象访问(享元,代理) :对象状态(备忘录)

2017-05-12 13:46 886 查看
七、性能与对象访问

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)、属性列表序列化和核心数据 中采用了备忘录模式。
(归档:是对 对象及其属性还有同其他对象间的关系进行编码,形成一个文档,该文档即可保存于文件系统,也可在进程或网络间传递。归档过程 是把对象图(对象与其他对象的关系)保存为一种与架构无关的字节流,保存对象的标识以及对象之间的关系。从字节流解码出来的对象通常用与对象编码时相同的类进行实例化。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐