(六)大话设计模式 - 模板方法(iOS版)
2019-03-20 本文已影响0人
林鹏_dev
定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。说的通俗一点,就是为子类设计一个模板以便于子类复用里面的方法。为了避免子类恶意修改方法的实现细节
代码实现
我们以App分享功能为例子简单分析一下,常见的分享有微信 QQ,微博等,好比友盟,shareSDK等,他们都是集成了很多种平台的分享功能,开发者可以很方便的使用它来分享到具体的平台
每个平台分享都是大同小异的 我们假定每个平台的分享流程都是一样一样的,唯一不同的地方在于平台类型,则可以创建一个模板,把公共的地方统一放在模板里,有不一样的地方,可以让子类来重写做差异化处理(这里我们就简单的分析,不做具体深入的研究,)
创建一个分享的模板
1.假定他们的分享流程都是一摸一样的(-(void)doShareTitle:(NSString *)title url:(NSURL *)url)
都需要"启动分享引擎" 和 "分享成功,数据回调"
2.差异化的地方在于平台类型不同(-(NSString *)configSharePlatform)
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface ShareTemplate : NSObject
//发起分享
-(void)doShareTitle:(NSString *)title url:(NSURL *)url;
//让子类告诉模板所需要分享的平台
-(NSString *)configSharePlatform;
@end
NS_ASSUME_NONNULL_END
#import "ShareTemplate.h"
@implementation ShareTemplate
/*
解决的问题
提高代码复用性
将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中
*/
-(void)doShareTitle:(NSString *)title url:(NSURL *)url {
NSLog(@"启动分享引擎");//各个平台
NSLog(@"发起【%@】分享",[self configSharePlatform]);
NSLog(@"分享成功,数据回调");
}
//让子类告诉模板所需要分享的平台
-(NSString *)configSharePlatform {
return @"share模板";
}
@end
微信分享 继承一个公用的share模板
#import "ShareTemplate.h"
NS_ASSUME_NONNULL_BEGIN
@interface ShareWX : ShareTemplate
@end
NS_ASSUME_NONNULL_END
#import "ShareWX.h"
@implementation ShareWX
-(NSString *)configSharePlatform {
return @"微信";
}
@end
QQ分享 继承一个公用的share模板
#import "ShareTemplate.h"
NS_ASSUME_NONNULL_BEGIN
@interface ShareQQ : ShareTemplate
@end
NS_ASSUME_NONNULL_END
#import "ShareQQ.h"
@implementation ShareQQ
-(NSString *)configSharePlatform {
return @"QQ";
}
@end
发起分享
ShareWX *wx = [[ShareWX alloc] init];
[wx doShareTitle:@"sss" url:[NSURL URLWithString:@""]];
ShareQQ *qq = [[ShareQQ alloc] init];
[qq doShareTitle:@"sss" url:[NSURL URLWithString:@""]];
2019-03-20 12:14:38.919116+0800 DesignModeDemo[16039:2665413] 启动分享引擎
2019-03-20 12:14:38.919291+0800 DesignModeDemo[16039:2665413] 发起【微信】分享
2019-03-20 12:14:38.925139+0800 DesignModeDemo[16039:2665413] 分享成功,数据回调
2019-03-20 12:14:38.925281+0800 DesignModeDemo[16039:2665413] 启动分享引擎
2019-03-20 12:14:38.925394+0800 DesignModeDemo[16039:2665413] 发起【QQ】分享
2019-03-20 12:14:38.925488+0800 DesignModeDemo[16039:2665413] 分享成功,数据回调
简单改造升级
可以使用简单工厂来简化一下分享
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSUInteger,ShareType){
ShareTypeWX = 0,
ShareTypeQQ
};
@interface ShareManager : NSObject
-(void)doShareTitle:(NSString *)title url:(NSURL *)url type:(ShareType)type;
@end
NS_ASSUME_NONNULL_END
#import "ShareManager.h"
#import "ShareWX.h"
#import "ShareQQ.h"
@implementation ShareManager
-(void)doShareTitle:(NSString *)title url:(NSURL *)url type:(ShareType)type {
ShareTemplate *shareTemplate = nil;
switch (type) {
case ShareTypeWX:
shareTemplate = [[ShareWX alloc] init];
break;
case ShareTypeQQ:
shareTemplate = [[ShareQQ alloc] init];
break;
default:
break;
}
[shareTemplate doShareTitle:title url:url];
}
@end
对外
//结合简单工厂的简易封装
ShareManager *shareManager = [[ShareManager alloc] init];
[shareManager doShareTitle:@"" url:[NSURL URLWithString:@""] type:ShareTypeWX];
2019-03-20 12:14:38.925622+0800 DesignModeDemo[16039:2665413] 启动分享引擎
2019-03-20 12:14:38.925749+0800 DesignModeDemo[16039:2665413] 发起【微信】分享
2019-03-20 12:14:38.925864+0800 DesignModeDemo[16039:2665413] 分享成功,数据回调
多琢磨琢磨 很多模式其实都是可以相互套用结合,使得代码的可维护,可复用性更强