1妒穴、定義
定義一系列算法览祖,把它們一個(gè)個(gè)封裝起來(lái),并且使它們可相互替換扭仁。本模式使得算法可獨(dú)立于使用它的客戶而變化垮衷。
如上UML類圖,context類可以通過(guò)他持有的Strategy對(duì)象來(lái)創(chuàng)建不同的ConcreteStrategy對(duì)象乖坠,從而調(diào)用不同的algorithmInterface方法搀突。
2、使用場(chǎng)景
在大量使用if-else或switch-case條件的業(yè)務(wù)場(chǎng)景下可以使用策略模式熊泵。
3仰迁、示例
比如今日頭條新聞列表根據(jù)不同的新聞?lì)愋蛣?chuàng)建不同的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]; //注冊(cè)CellA和CellB
[self createDataSourceAndReloadData]; //構(gòu)建數(shù)據(jù)源
}
- (void)registerTableViewCell
{
//注冊(cè)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
{
//通過(guò)策略模式避免了大量的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];
//訂單狀態(tài)
[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
//子類可重寫(xiě)該類方法
- (void)initWithModel:(id)model;
@end
@interface PCCellA : PCBaseCell
- (void)initWithModel:(id)model; //重寫(xiě)該方法
@end
@interface PCCellB : PCBaseCell
- (void)initWithModel:(id)model; //重寫(xiě)該方法
@end