美文网首页
iOS设计模式之策略(strategy)模式

iOS设计模式之策略(strategy)模式

作者: 52xpz | 来源:发表于2017-08-02 20:49 被阅读53次

    1、定义

    定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

    如上UML类图,context类可以通过他持有的Strategy对象来创建不同的ConcreteStrategy对象,从而调用不同的algorithmInterface方法。

    2、使用场景

    在大量使用if-else或switch-case条件的业务场景下可以使用策略模式。

    3、示例

    比如今日头条新闻列表根据不同的新闻类型创建不同的cell就可以采用策略模式。如下代码所示

    #define kClassKey @"kClassKey"

    #define kModelKey @"kModelKey"

    #define kReuseKey @"kReuseKey"

    #define CellAID @"cellA"

    #define CellBID @"cellB"

    @interface PCCarOrderDetailViewController ()

    @property (nonatomic,strong) NSMutableArray *dataSource;

    @end

    - (void)viewDidLoad

    {

    [super viewDidLoad];

    [self registerTableViewCell]; //注册CellA和CellB

    [self createDataSourceAndReloadData]; //构建数据源

    }

    - (void)registerTableViewCell

    {

    //注册cell

    [self registerTableViewCellNibWithClass:[PCCellA class] reuseId:CellAID];

    [self registerTableViewCellNibWithClass:[PCCellB class] reuseId:CellBID];

    }

    - (void)registerTableViewCellNibWithClass:(Class)cls reuseId:(NSString *)reuseId

    {

    if (!cls || !reuseId)

    {

    return;

    }

    [self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass(cls) bundle:nil] forCellReuseIdentifier:reuseId];

    }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    {

    //通过策略模式避免了大量的if-else-if-else判断

    NSDictionary* dic = self.dataSource[indexPath.row];

    PCBaseCell *cell = [tableView dequeueReusableCellWithIdentifier:dic[kReuseKey] forIndexPath:indexPath];

    if ([cell respondsToSelector:@selector(initWithModel:)])

    {

    [cell initWithModel:dic[kModelKey]];

    }

    return cell;

    }

    - (void)createDataSourceAndReloadData

    {

    self.dataSource = [NSMutableArray array];

    //订单状态

    [self.dataSource addObject:[NSDictionary dictionaryWithObjectsAndKeys:[PCCellA class], kClassKey, [[PCModel alloc] init], kModelKey, CellAID, kReuseKey, nil]];

    [self.dataSource addObject:[NSDictionary dictionaryWithObjectsAndKeys:[PCCellB class], kClassKey, [PCModel alloc] init], kModelKey, CellBID, kReuseKey, nil]];

    [self.tableView reloadData];

    }

    @interface PCBaseCell : UITableViewCell

    //子类可重写该类方法

    - (void)initWithModel:(id)model;

    @end

    @interface PCCellA : PCBaseCell

    - (void)initWithModel:(id)model; //重写该方法

    @end

    @interface PCCellB : PCBaseCell

    - (void)initWithModel:(id)model; //重写该方法

    @end

    相关文章

      网友评论

          本文标题:iOS设计模式之策略(strategy)模式

          本文链接:https://www.haomeiwen.com/subject/lchylxtx.html