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

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. 子类公共的算法应该放在一个公共的类中,避免代码重复

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

时间: 2024-04-24 09:33:30

设计模式之模版方法设计模式的相关文章

Java设计模式之模版方法模式简介_java

Java设计模式的模板方法模式定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤.属于行为类模式 如下图所示: 事实上,模版方法是编程中一个经常用到的模式.先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来.经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就有点麻烦了.但是A有办法,先把打印功能完成,排序功能另找人做. abstract cla

C++设计模式之工厂方法模式_C 语言

问题描述 之前讲到了C++设计模式--简单工厂模式,由于简单工厂模式的局限性,比如:工厂现在能生产ProductA.ProductB和ProductC三种产品了,此时,需要增加生产ProductD产品:那么,首先是不是需要在产品枚举类型中添加新的产品类型标识,然后,修改Factory类中的switch结构代码.是的,这种对代码的修改,对原有代码的改动量较大,易产生编码上的错误(虽然很简单,如果工程大了,出错也是在所难免的!!!).这种对代码的修改是最原始,最野蛮的修改,本质上不能称之为对代码的扩

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 [Head First设计模式]饺子馆(冬至)中的设计模式--工厂模式 [Head First设计模式]一个人的平安夜--单例模式 [Head First设计模式]抢票中的设计模式--代理模式 [Head First设计模式]面向对象的3特征5原则 [Head First设计模式]鸭子

C#设计模式之Template Method设计模式(模版方法模式)

一.模板方法(Template Method)模式 准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模版方法模式的用意. 很多人可能没有想到,模版方法模式实际上是所有模式中最为常见的几个模式之一,而且很多人可能使用过模版方法模式而没有意识到自己已经使用了这个模式.模版方法模式是基于继承的代码复用的基本技术,模版方法模式的结构和用法也是面向对象设计的核心. 模

设计模式之九(模版方法模式)

原文:设计模式之九(模版方法模式) 前言 模版方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 结构图 代码实现  AbstractClass是抽象类,其实也就是一抽象类,定义并实现了一个模版方法,这个模版方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现.顶级逻辑也有可能调用一些具体方法. public abstract class AbstractCla

.NET设计模式-模版方法(Template Method)

摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要.   主要内容 1.概述 2.Template Method解说 3..NET中的Template Method模式 4.适用性及实现要点   概述 变化一直以来都是软件设计的永恒话题,在XP编程中提倡拥抱变化,积极应对.如何更好的去抓住变化点,应对变化?如何更好的提高代码复用?通过学习Template Method模式,您应该有一个新的认识. 意图 定义一个操作中的算法的骨架,

C#设计模式(3)——工厂方法模式

原文:C#设计模式(3)--工厂方法模式 一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以解决简单工厂模式中存在的这个问题,下面就具体看看工厂模式是如何解决该问题的. 二.工厂方法模式的实现 工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这

乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) 作者:webabcd 介绍 定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例 有SqlMessage和XmlMessage,用Factory Method来实例化它们. MessageModel using Syst

设计模式之三(工厂方法模式)

原文:设计模式之三(工厂方法模式) 前言 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化那一个类.工厂方法使一个类的实例化延迟到其子类. 简单工厂模式(http://www.cnblogs.com/aehyok/archive/2013/05/10/3072008.html)的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖. 工厂方法模式实现时,客户端需要决定实例化那一个工厂来实现运算类,选择判断的问题还是存在