设计模式之模版方法设计模式

简介:

1.问题引入:在答题时,对于同样的试题,答题者会有不同的答案,试题是不变的,变得是答案,遇到这样的可以使用模版方法来解决

定义 :定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Te m p l a t e M e t h o d 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

适用

  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
  • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是Opdyke和Johnson所描述过的“重分解以一般化”的一个很好的例子。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
  • 控制子类扩展。模板方法只在特定点调用“hook”操作,这样就只允许在这些点进行扩展。

2.UML类图

3.实现

1、定义模版基类(试卷 不可变部分) UML中用的是抽象类,oc中没有抽象类,这里用基类代替, - (NSString *)answer1;- (NSString *)answer2;可看作是抽象方法


#import <Foundation/Foundation.h>

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


#import "TextPaper.h"

@implementation TextPaper
-(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;
}

2、定义子类继承基类 (答案 可变部分)


#import "TextPaper.h"

@interface TextPaperA : TextPaper

@end


#import "TextPaperA.h"

@implementation TextPaperA
-(NSString *)answer1{
    return @"b";
}
-(NSString *)answer2{
    return @"c";
}
@end


#import "TextPaper.h"

@interface TextPaperB : TextPaper

@end


#import "TextPaperB.h"

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

3.调用


TextPaper *paperA = [[TextPaperA alloc]init];
    [paperA testQuestion1];
    [paperA testQuestion2];
    
    TextPaper *paperB = [[TextPaperB alloc]init];
    [paperB testQuestion1];
    [paperB testQuestion2];

4.输出

5.模版方法模式和策略模式的区别

Strategy模式的应用场景是:
1. 多个类的分别只是在于行为不同
2. 你需要对行为的算法做很多变动
3. 客户不知道算法要使用的数据

Template Method模式的应用场景是:
1. 你想将相同的算法放在一个类中,将算法变化的部分放在子类中实现
2. 子类公共的算法应该放在一个公共的类中,避免代码重复

个人体会 :要面向接口的编程,而不是面向实现的编程。 不变的封装固定,变的做为接口


相关文章
|
7月前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
65 0
|
7月前
|
设计模式 NoSQL Java
常用的设计模式以及操作Redis、MySQL数据库、各种MQ、数据类型转换的方法
常用的设计模式以及操作Redis、MySQL数据库、各种MQ、数据类型转换的方法
|
3月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
|
5月前
|
设计模式
对抗软件复杂度问题之组合(Composite)方法设计模式是什么,如何解决
对抗软件复杂度问题之组合(Composite)方法设计模式是什么,如何解决
|
5月前
|
设计模式 算法
交易链路设计原则&模式问题之中介者(Mediator)方法设计模式是什么,如何解决
交易链路设计原则&模式问题之中介者(Mediator)方法设计模式是什么,如何解决
|
5月前
|
设计模式 Java
交易链路设计原则&模式问题之依赖倒置原则体现在实际应用中,如何解决
交易链路设计原则&模式问题之依赖倒置原则体现在实际应用中,如何解决
|
6月前
|
设计模式 机器学习/深度学习 JSON
文件读取的高效方法与设计模式
文件读取的高效方法与设计模式
46 0
|
设计模式 存储 Python
【从零学习python 】46. Python中的__new__和__init__方法解析及单例设计模式
【从零学习python 】46. Python中的__new__和__init__方法解析及单例设计模式
68 0
|
设计模式 程序员
设计模式 | 模版方法
设计模式 | 模版方法
84 0
|
7月前
|
设计模式 算法 自动驾驶
常见的设计模式(模板与方法,观察者模式,策略模式)
随着时间的推移,软件代码越来越庞大,随着而来的就是如何维护日趋庞大的软件系统。在面向对象开发出现之前,使用的是面向过程开发来设计大型的软件程序,面向过程开发将软件分成一个个单独的模块,模块之间使用函数进行组合,最后完成系统的开发,每次需要修改软件,如果不涉及好各个模块的关系,就会导致软件系统难以维护,从而导致软件变得不可使用。面向对象方法用对象模拟问题域中的实体,以对象间的联系刻画实体间联系
106 2