ios-模板类方法模式

951 阅读2分钟

定义一个操作中的算法的框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

  • 如答题者要做的步骤
    • 1.填写自己的名字准备答题
    • 2.回答第一题
    • 3.回答第二题
    • 4.完成答题
  • 第一步和第四部每个人都是一样的,但是回答第一题和回答第二题的时候每个人的答案可能不相同。
  • 其实本质上就是 父类定义了一连串的方法步骤去依次执行,然后子类去重新特定的方法去改变自己特有的实现。
  • 建立
#import <Foundation/Foundation.h>

@interface HCDtextPaper : NSObject
- (void)testPrepare;
- (void)testQuestion1;
- (NSString *)answer1;
- (void)testQuestion2;
- (NSString *)answer2;
@end

#import "HCDtextPaper.h"

@implementation HCDtextPaper
-(void)testPrepare{
    NSLog(@"填写自己的名字准备答题");
}

-(void)testQuestion1{
    NSLog(@"问题:杨过得到,后来给了郭靖,炼成倚天剑、屠龙刀的玄铁可能是[ ]:a.球磨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维");
    NSLog(@"答案:%@", [self answer1]);
}
-(NSString *)answer1{
    return nil;
}
-(void)testQuestion2{
    NSLog(@"问题:杨过、程英、陆无双铲除了情花,造成[ ]:a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化");
    NSLog(@"答案:%@", [self answer2]);
}
-(NSString *)answer2{
    return nil;
}
- (void)dealloc{
    NSLog(@"完成答题");
}

@end

#import "HCDtextPaper.h"

@interface HCDtextPaperA : HCDtextPaper

@end

#import "HCDtextPaperA.h"

@implementation HCDtextPaperA
- (instancetype)init
{
    self = [super init];
    if (self) {
        [self testPrepare];
    }
    return self;
}
- (void)testPrepare{
    NSLog(@"A");
    [super testPrepare];
    NSLog(@"还在自己名字上画个心");
}
-(NSString *)answer1{
    return @"b";
}
-(NSString *)answer2{
    return @"c";
}


@end
#import "HCDtextPaper.h"

@interface HCDtextPaperB : HCDtextPaper

@end

#import "HCDtextPaperB.h"

@implementation HCDtextPaperB
- (instancetype)init
{
    self = [super init];
    if (self) {
        [self testPrepare];
    }
    return self;
}

-(NSString *)answer1{
    return @"a";
}
-(NSString *)answer2{
    return @"d";
}
@end

  • 调用
#import "ViewController.h"
#import "HCDtextPaper.h"
#import "HCDtextPaperA.h"
#import "HCDtextPaperB.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    HCDtextPaper *paperA = [[HCDtextPaperA alloc]init];
    [paperA testQuestion1];
    [paperA testQuestion2];
    
    HCDtextPaper *paperB = [[HCDtextPaperB alloc]init];
    [paperB testQuestion1];
    [paperB testQuestion2];
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end