1.

有一道iOS面试题,iOS中都有什么设计模式?很少有答案说包括adapter。

gof 书中adapter模式有以下内容:

实现:

。。。

b ) 使 用 代 理 对 象 在这种方法中, T r e e D i s p l a y 将访问树结构的请求转发到代理对象。 T r e e D i s p l a y 的 客 户 进 行 一 些 选 择 , 并 将 这 些 选 择 提 供 给 代理 对 象 , 这 样 客 户 就 可 以 对 适 配 加 以控制,如下图所示。

例 如 , 有 一 个 D i r e c t o r y B r o w s e r , 它 像 前 面 一 样 使 用 T r e e D i s p l a y 。 D i r e c t o r y B r o w s e r 可能 为匹配 T r e e D i s p l a y 和 层 次 目 录 结 构 构 造 出 一 个 较 好 的 代 理 。 在 S m a l l t a l k 或 O b j e c t i v e C 这样的 动态类型语言中,该方法只需要一个接口对适配器注册代理即可。然后 T r e e D i s p l a y 简单地将 请求转发给代理对象。 N E X T S T E P [ A d d 9 4 ] 大 量 使 用 这 种 方 法 以 减 少 子 类 化 。

后来instagram开源了IGListKit,https://github.com/Instagram/IGListKit。就是Adapter模式。

@interface IGListAdapter : NSObject

/**
The view controller that houses the adapter.
*/
@property (nonatomic, nullable, weak) UIViewController *viewController; /**
The collection view used with the adapter.
*/
@property (nonatomic, nullable, weak) UICollectionView *collectionView; /**
The object that acts as the data source for the adapter.
*/
@property (nonatomic, nullable, weak) id <IGListAdapterDataSource> dataSource; /**
The object that receives top-level events for section controllers.
*/
@property (nonatomic, nullable, weak) id <IGListAdapterDelegate> delegate; /**
The object that receives `UICollectionViewDelegate` events. @note This object *will not* receive `UIScrollViewDelegate` events. Instead use scrollViewDelegate.
*/
@property (nonatomic, nullable, weak) id <UICollectionViewDelegate> collectionViewDelegate; /**
The object that receives `UIScrollViewDelegate` events.
*/
@property (nonatomic, nullable, weak) id <UIScrollViewDelegate> scrollViewDelegate; /**
The updater for the adapter.
*/
@property (nonatomic, strong, readonly) id <IGListUpdatingDelegate> updater; /**
A bitmask of experiments to conduct on the adapter.
*/
@property (nonatomic, assign) IGListExperiment experiments; /**
Initializes a new `IGListAdapter` object. @param updater An object that manages updates to the collection view.
@param viewController The view controller that will house the adapter.
@param workingRangeSize The number of objects before and after the viewport to consider within the working range. @return A new list adapter object. @note The working range is the number of objects beyond the visible objects (plus and minus) that should be
notified when they are close to being visible. For instance, if you have 3 objects on screen and a working range of 2,
the previous and succeeding 2 objects will be notified that they are within the working range. As you scroll the list
the range is updated as objects enter and exit the working range. To opt out of using the working range, use `initWithUpdater:viewController:` or provide a working range of `0`.
*/
- (instancetype)initWithUpdater:(id <IGListUpdatingDelegate>)updater
viewController:(nullable UIViewController *)viewController
workingRangeSize:(NSInteger)workingRangeSize NS_DESIGNATED_INITIALIZER; /**
Initializes a new `IGListAdapter` object with a working range of `0`. @param updater An object that manages updates to the collection view.
@param viewController The view controller that will house the adapter. @return A new list adapter object.
*/
- (instancetype)initWithUpdater:(id <IGListUpdatingDelegate>)updater
viewController:(nullable UIViewController *)viewController; /**
Perform an update from the previous state of the data source. This is analogous to calling
`-[UICollectionView performBatchUpdates:completion:]`. @param animated A flag indicating if the transition should be animated.
@param completion The block to execute when the updates complete.
*/
- (void)performUpdatesAnimated:(BOOL)animated completion:(nullable IGListUpdaterCompletion)completion; /**
Perform an immediate reload of the data in the data source, discarding the old objects. @param completion The block to execute when the reload completes.
*/
- (void)reloadDataWithCompletion:(nullable IGListUpdaterCompletion)completion; /**
Reload the list for only the specified objects. @param objects The objects to reload.
*/
- (void)reloadObjects:(NSArray *)objects; /**
Query the section controller at a given section index. Constant time lookup. @param section A section in the list. @return A section controller or `nil` if the section does not exist.
*/
- (nullable IGListSectionController *)sectionControllerForSection:(NSInteger)section; /**
Query the section index of a list. Constant time lookup. @param sectionController A list object. @return The section index of the list if it exists, otherwise `NSNotFound`.
*/
- (NSInteger)sectionForSectionController:(IGListSectionController *)sectionController; /**
Returns the section controller for the specified object. Constant time lookup. @param object An object from the data source. @return A section controller or `nil` if `object` is not in the list. @see `-[IGListAdapterDataSource listAdapter:sectionControllerForObject:]`
*/
- (__kindof IGListSectionController * _Nullable)sectionControllerForObject:(id)object; /**
Returns the object corresponding to the specified section controller in the list. Constant time lookup. @param sectionController A section controller in the list. @return The object for the specified section controller, or `nil` if not found.
*/
- (nullable id)objectForSectionController:(IGListSectionController *)sectionController; /**
Returns the object corresponding to a section in the list. Constant time lookup. @param section A section in the list. @return The object for the specified section, or `nil` if the section does not exist.
*/
- (nullable id)objectAtSection:(NSInteger)section; /**
Returns the section corresponding to the specified object in the list. Constant time lookup. @param object An object in the list. @return The section index of `object` if found, otherwise `NSNotFound`.
*/
- (NSInteger)sectionForObject:(id)object; /**
Returns a copy of all the objects currently driving the adapter. @return An array of objects.
*/
- (NSArray *)objects; /**
An unordered array of the currently visible section controllers. @return An array of section controllers.
*/
- (NSArray<IGListSectionController *> *)visibleSectionControllers; /**
An unordered array of the currently visible objects. @return An array of objects
*/
- (NSArray *)visibleObjects; /**
An unordered array of the currently visible cells for a given object. @param object An object in the list @return An array of collection view cells.
*/
- (NSArray<UICollectionViewCell *> *)visibleCellsForObject:(id)object; /**
Scrolls to the specified object in the list adapter. @param object The object to which to scroll.
@param supplementaryKinds The types of supplementary views in the section.
@param scrollDirection An option indicating the direction to scroll.
@param scrollPosition An option that specifies where the item should be positioned when scrolling finishes.
@param animated A flag indicating if the scrolling should be animated.
*/
- (void)scrollToObject:(id)object
supplementaryKinds:(nullable NSArray<NSString *> *)supplementaryKinds
scrollDirection:(UICollectionViewScrollDirection)scrollDirection
scrollPosition:(UICollectionViewScrollPosition)scrollPosition
animated:(BOOL)animated; /**
Returns the size of a cell at the specified index path. @param indexPath The index path of the cell. @return The size of the cell.
*/
- (CGSize)sizeForItemAtIndexPath:(NSIndexPath *)indexPath; /**
Returns the size of a supplementary view in the list at the specified index path. @param elementKind The kind of supplementary view.
@param indexPath The index path of the supplementary view. @return The size of the supplementary view.
*/
- (CGSize)sizeForSupplementaryViewOfKind:(NSString *)elementKind
atIndexPath:(NSIndexPath *)indexPath; /**
:nodoc:
*/
- (instancetype)init NS_UNAVAILABLE; /**
:nodoc:
*/
+ (instancetype)new NS_UNAVAILABLE; @end

2.

AVIMCMD 只需实现 packToSendData

- (void)sendCustomC2CMsg:(AVIMCMD *)cmd toUser:(id<IMUserAble>)recv succ:(TIMSucc)succ fail:(TIMFail)fail
{
if (cmd && recv)
{
TIMConversation *conv = [[TIMManager sharedInstance] getConversation:TIM_C2C receiver:[recv imUserId]]; TIMCustomElem *elem = [[TIMCustomElem alloc] init];
elem.data = [cmd packToSendData]; TIMMessage *timMsg = [[TIMMessage alloc] init];
[timMsg addElem:elem]; [timMsg setPriority:TIM_MSG_PRIORITY_HIGH]; [conv sendMessage:timMsg succ:^{ if (cmd.userAction == AVIMCMD_PACustomMsg)
{
[self onRecvC2CSender:[IMAPlatform sharedInstance].host customMsg:elem];
} if (succ)
{
succ();
}
} fail:^(int code, NSString *msg) { DebugLog(@"发送消息失败:%@", timMsg); if (fail)
{
fail(code, msg);
}
}];
}
} ... - (NSData *)packToSendData
{
NSMutableDictionary *post = [NSMutableDictionary dictionary];
[post setObject:@(self.userAction) forKey:@"userAction"]; if (self.actionParam && self.actionParam.length > )
{
[post setObject:self.actionParam forKey:@"actionParam"];
}
if (self.msgId && self.msgId.length > )
{
[post setObject:self.msgId forKey:@"id"];
}
if (self.type && self.type.length>)
{
[post setObject:self.type forKey:@"type"];
} if (_nickName && _nickName.length > )
{
[post setObject:_nickName forKey:@"NickName"];
} if (_content && _content.length > )
{
[post setObject:_content forKey:@"Content"];
} if (_headUrl && _headUrl.length > )
{
[post setObject:_headUrl forKey:@"HeadUrl"];
} if (_company && _company.length > )
{
[post setObject:_company forKey:@"Company"];
} if (_roomId && _roomId.length > )
{
[post setObject:_roomId forKey:@"RoomId"];
} if (_muteUserId && _muteUserId.length > )
{
[post setObject:_muteUserId forKey:@"MuteUserId"];
} NSLog(@"发送的参数:%@", post);
if ([NSJSONSerialization isValidJSONObject:post])
{
NSError *error = nil;
NSData *data = [NSJSONSerialization dataWithJSONObject:post options:NSJSONWritingPrettyPrinted error:&error];
if(error)
{
// DebugLog(@"[%@] Post Json Error: %@", [self class], post);
return nil;
} // DebugLog(@"AVIMCMD content is %@", post);
return data;
}
else
{
// DebugLog(@"[%@] AVIMCMD is not valid: %@", [self class], post);
return nil;
}
}

TIMCustomElem *转 TCShowLiveMsg*

// 收到C2C自定义消息
- (void)onRecvC2CSender:(id<IMUserAble>)sender customMsg:(TIMCustomElem *)msg
{
id<AVIMMsgAble> cachedMsg = [self cacheRecvC2CSender:sender customMsg:msg];
[self enCache:cachedMsg noCache:^(id<AVIMMsgAble> msg){
。。。 - (id<AVIMMsgAble>)cacheRecvC2CSender:(id<IMUserAble>)sender customMsg:(TIMCustomElem *)msg
{
NSString *datastring = [[NSString alloc] initWithData:msg.data encoding:NSUTF8StringEncoding]; NSLog(@"接收到的消息:%@", datastring);
TCShowLiveMsg *cmsg = [NSObject parse:[TCShowLiveMsg class]
jsonString:datastring]; cmsg.msgText = cmsg.Content;
cmsg.sender = sender;
cmsg.isC2CMsg = YES;
if (!_isPureMode)
{
[cmsg prepareForRender];
}
return cmsg; }
//重写该方法
- (id<AVIMMsgAble>)cacheRecvGroupSender:(id<IMUserAble>)sender customMsg:(TIMCustomElem *)msg;
{
NSString *datastring = [[NSString alloc] initWithData:msg.data encoding:NSUTF8StringEncoding]; NSLog(@"接收到的消息:%@", datastring); TCShowLiveMsg *cmsg = [NSObject parse:[TCShowLiveMsg class] jsonString:datastring];

3.

mvc

https://github.com/Yrocky/NetworkCouplerController/

第9月第15天 设计模式 adapter mvc的更多相关文章

  1. Android 设计模式之MVC模式

    说到Android设计模式的MVC模式,估计很多人都是比较熟悉了,这里深入了解一下MVC到底是怎么回事,以ListView为例子讲解. 一.深入理解MVC概念 MVC即Model-View-Contr ...

  2. python 设计模式之MVC模式

    一.简单介绍 mvc模式  the  model-view-controller pattern mvc模式是一个运用在软件工程中的设计模式.mvc模式脱离了以前简单的web服务设计逻辑,将开发,测试 ...

  3. Python设计模式之MVC模式

    # -*- coding: utf-8 -*- # author:baoshan quotes = ('A man is not complete until he is married. Then ...

  4. 1个月连载30个设计模式真实案例(附源码),挑战年薪60W不是梦

    本文所有内容均节选自<设计模式就该这样学> 本文自2012年10月29日起持续连载,请大家持续关注.... 序言 Design Patterns: Elements of Reusable ...

  5. C++设计模式-Adapter适配器模式(转)

    Adapter适配器模式作用:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 分为类适配器模式和对象适配器模式. 系统的数据和 ...

  6. java设计模式—Adapter模式

    1.核心意图:     将一个类的接口转换成客户希望的另外一个接口,从而使得原本由于接口不兼容而不能一起工作的类可以一起工作. 该模式的目标是通过一个代理(这里是Adapter),在原来的类(Adap ...

  7. 设计模式Adapter模式的五分钟

    五分钟一个设计模式.来形容叙述的设计模式的最简单方法.看到许多其他设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/catego ...

  8. [C# 设计模式] Adapter - 适配器模式(两种)

    Adapter - 适配器模式 序 现实生活中,我们常用到适配器. 你当前打开我这篇文章的笔记本电脑,电源的另一边不正连着一块适配器吗? 你平时想将三口插座插进二口插座里面,不也需要一个适配器吗? 整 ...

  9. 设计模式-Adapter(结构型模式)针对第三方库 函数 接口不匹配的问题,分为类模式 与 对象模式 两种

    以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //****************************类模式的Adaptr*********************** ...

随机推荐

  1. 1083. List Grades (25)-简单的排序

    给定区间[L,R],给出在这区间之内的学生,并且按照他们的成绩非升序的顺序输出. #include <iostream> #include <cstdio> #include ...

  2. linux内核分析第二周

    网易云课堂linux内核分析第二周 20135103                王海宁 <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...

  3. Linux内核实验作业七

    实验作业:Linux内核如何装载和启动一个可执行程序 20135313吴子怡.北京电子科技学院 [第一部分]理解编译链接的过程和ELF可执行文件格式 1.编译链接的过程 2.ELF可执行文件格式 一个 ...

  4. 使用VS2013进行C#程序的单元测试

    没有按照预期的那样做出成功的单元测试,磕磕绊绊参照了下面两篇博客大致做出来了,所以很有必要记录一下过程. http://www.cnblogs.com/duasonir/p/5299732.html( ...

  5. 团队作业一 庆祝"十五万的总冠军"成立

    很荣幸能够撰写我们团队的第一篇博客. 我们这些同学能组成一个新的团队真的很高兴,团队中的每一个人都有自己的优点的长处.希望在工作中我们能竭尽 所能,充分发挥我们的本事,让我们大家各自发挥自己的才能.. ...

  6. Linux基础二(挂载、关机重启与系统等级)

    一.Linux 基础之挂载 1. 挂载和查询 1.1 挂载 什么叫挂载?装系统的时候要给硬盘分区,在 Windows 中要分 C 盘 D 盘 DEF 盘,这个操作我们叫做分配盘符,分配盘符之后我们就可 ...

  7. 11th 5个新的问题——关于软件工程

    5个新的问题: 1.现在课上,我们每一个团队开发一个软件,遵循的是敏捷流程,近乎每天都召开Scrum会议,但这一切都基于团队人数很少,这样我们可以畅所欲言,而且不会花费过长时间,但是,如果是大团队呢? ...

  8. js 中引用类型 的深拷贝 和 浅拷贝的区别

    一.曾经在读JQ源码的时候,对深拷贝算是有了一点的理解.我们在项目中是不是经常会遇到这样的问题呢? 后台返回一个数组对象(引用类型).次数在页面渲染中需要对部分数据进行处理 比如:银行卡6234509 ...

  9. ionic npm安装报错 no such file ,解决办法

    Install the latest version of NodeJS from their website (e.g. 6.X.X). Open the Node.js command promp ...

  10. Delphi字符串转日期,强大到窒息,VarToDateTime解决了困扰很久的小问题

    procedure THRForm.Button1Click(Sender: TObject); var D:TDateTime; s:string; begin D:=VarToDateTime(' ...