iOS设计模式之—适配器模式

fglownarxx 8年前
   <h3>一、何为适配器模式</h3>    <p>在我们做项目的时候,会遇到一些相同的cell视图,但是数据源不同。比较传统的写法就是在cell中写两个Model的方法用于给视图传递值,这种方法可行,但不是最佳,如果后期其他的页面也需要用到这个cell,我们又要在cell中再写一个Model方法,不利于后期的迭代,而且代码的耦合度太高。这个时候就要用到我们的适配器了。</p>    <p>适配器,用于连接两种不同类的对象,使其能够协同工作。</p>    <p>类适配器OMT图示法(请忽略我的文字,丑的我都不想看)</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/fced0092e6be2410e128c413f204baf8.png"></p>    <h3>二、何时使用适配器</h3>    <ol>     <li>已有的接口与需求不匹配</li>     <li>想要一个可复用的类,该类能够和其他不谦容的类协作</li>     <li>需要适配一个类的几个不同的子类,可以使用对象适配器适配父类的接口</li>    </ol>    <h3>三、实现</h3>    <p>1.协议方法</p>    <p>定义要适配的接口</p>    <pre>  <code class="language-objectivec">@protocol AdapterProtocol <NSObject>    - (NSString *)title;  - (UIImage *)headImage;    @end</code></pre>    <p>2.根适配器</p>    <p>定义被适配的数据源类,遵守AdapterProtocol协议,并重载协议方法</p>    <pre>  <code class="language-objectivec">#import"AdapterProtocol.h"  @interfaceRootAdapter :NSObject<AdapterProtocol>    @property(weak,nonatomic)id data;  - (instancetype)initWithData:(id)data;    @end    @implementationRootAdapter    - (instancetype)initWithData:(id)data{    self= [super init];    if(self) {    self.data= data;    }    return self;  }  - (NSString*)title{    return nil;  }  - (UIImage*)headImage{    return nil;  }  @end</code></pre>    <p>3.根据类创建适配器</p>    <p>创建适配器,继承根适配器</p>    <pre>  <code class="language-objectivec">@interfacePeopleAdapter :RootAdapter  @end    - (instancetype)initWithData:(id)data{    self = [super init];    if( self ) {    self.data= data;    }    return self;  }  - (NSString*)title{    PeopleModel *model =self.data;    return model.name;  }  - (UIImage*)headImage{    PeopleModel *model =self.data;    UIImage *image = [UIImageimageNamed:model.icon];    return image;  }</code></pre>    <p>4.Cell中定义读取数据方法,参数遵守AdapterProtocol协议</p>    <pre>  <code class="language-objectivec">- (void)reloadData:(id<AdapterProtocol>)data{    self.adapterImage.image= [data headImage];    self.adapterTitle.text= [data title];  }</code></pre>    <p>5.Controller中使用</p>    <pre>  <code class="language-objectivec">- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{      staticNSString*identifier =@"Cell";    AdapterTableViewCell *cell =                 [tableView dequeueReusableCellWithIdentifier:identifier];    if(!cell) {      cell =           [[AdapterTableViewCell alloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:identifier];    }    if(self.dataType==0) {      PeopleModel *peopleM =self.peopleDatalist[indexPath.row];      PeopleAdapter *peopleA =             [[PeopleAdapter alloc]initWithData:peopleM];      [cell reloadData:peopleA];    }else{      AnimalModel *animalM =self.animalDatalist[indexPath.row];      AnimalAdapter *animalA =             [[AnimalAdapter alloc]initWithData:animalM];      [cell reloadData:animalA];      }    return cell;  }</code></pre>    <p> </p>    <p> </p>    <p>来自:http://www.jianshu.com/p/5044fe6419c3</p>    <p> </p>