模版方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
优点:
1、模版方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。
2、模板方法模式是一种代码复用的基本技术。
3、模板方法模式导致一种反向的控制结构,通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,符合“开闭原则”。
缺点:
1、每实现一种模版都需要创建一个类,提高了阅读代码都复杂度。
2、只能按照模版给定的方式来执行,灵活性差。
项目地址:https://github.com/GameRisker/Study-Design-Patterns.git
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// // main.m // TemplateMethod // // Created by GameRisker on 16/1/17. // Copyright (c) 2016年 GameRisker. All rights reserved. // #import "TestPaper.h" #import "TestPaperStudentA.h" #import "TestPaperStudentB.h" #import <Foundation/Foundation.h> int main(int argc, const char *argv[]) { @autoreleasepool { TestPaper *studentA = [[TestPaperStudentA alloc] init]; [studentA QuestionA]; [studentA QuestionB]; [studentA QuestionC]; TestPaper *studentB = [[TestPaperStudentB alloc] init]; [studentB QuestionA]; [studentB QuestionB]; [studentB QuestionC]; } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// // TestPaper.h // // // Created by GameRisker on 16/1/17. // // #import <Foundation/Foundation.h> @interface TestPaper : NSObject - (void)QuestionA; - (void)QuestionB; - (void)QuestionC; - (NSString *)AnswerA; - (NSString *)AnswerB; - (NSString *)AnswerC; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
// // TestPaper.m // // // Created by GameRisker on 16/1/17. // // #import "TestPaper.h" @implementation TestPaper - (void)QuestionA { NSLog(@"this is Question A ?"); NSLog(@"answer : %@", [self AnswerA]); } - (void)QuestionB; { NSLog(@"this is Question B ?"); NSLog(@"answer : %@", [self AnswerB]); } - (void)QuestionC; { NSLog(@"this is Question C ?"); NSLog(@"answer : %@", [self AnswerC]); } - (NSString *)AnswerA; { return @""; } - (NSString *)AnswerB; { return @""; } - (NSString *)AnswerC; { return @""; } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// // TestPaperStudentA.h // // // Created by GameRisker on 16/1/17. // // #import "TestPaper.h" @interface TestPaperStudentA : TestPaper @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// // TestPaperStudentA.m // // // Created by GameRisker on 16/1/17. // // #import "TestPaperStudentA.h" @implementation TestPaperStudentA - (NSString *)AnswerA { return @"studentA : A"; } - (NSString *)AnswerB { return @"studentA : A"; } - (NSString *)AnswerC { return @"studentA : A"; } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// // TestPaperStudentB.h // // // Created by GameRisker on 16/1/17. // // #import "TestPaper.h" @interface TestPaperStudentB : TestPaper @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// // TestPaperStudentB.m // // // Created by GameRisker on 16/1/17. // // #import "TestPaperStudentB.h" @implementation TestPaperStudentB - (NSString *)AnswerA { return @"studentA : B"; } - (NSString *)AnswerB { return @"studentA : B"; } - (NSString *)AnswerC { return @"studentA : B"; } @end |