《大话设计模式》ruby版代码:模板方法模式

需求:

学生抄题目,做题目

初始代码

# -*- encoding: utf-8 -*-

#学生甲的试卷类
class TestPaperA

    def question1
        puts ‘杨过得到,后来给了郭靖,炼成倚天剑,屠龙刀的玄铁可能是[]  a.球墨铸铁 b.马口铁 c.高速合金钢 d.碳塑纤维 ‘
        puts ‘答案:b‘
    end

    def question2
        puts ‘杨过、程英、陆无双铲除了情花,造成了[] a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化  ‘
        puts ‘答案:a‘
    end

    def question3
        puts ‘蓝凤凰的致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[] a.阿司匹林 b.牛黄解毒片 c.氟酸 d.让他们喝大量的生牛奶 e.以上全不对‘
        puts ‘答案:c‘
    end

end
#学生乙的试卷类
class TestPaperB

    def question1
        puts ‘杨过得到,后来给了郭靖,炼成倚天剑,屠龙刀的玄铁可能是[]  a.球墨铸铁 b.马口铁 c.高速合金钢 d.碳塑纤维 ‘
        puts ‘答案:d‘
    end

    def question2
        puts ‘杨过、程英、陆无双铲除了情花,造成了[] a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化  ‘
        puts ‘答案:b‘
    end

    def question3
        puts ‘蓝凤凰的致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[] a.阿司匹林 b.牛黄解毒片 c.氟酸 d.让他们喝大量的生牛奶 e.以上全不对‘
        puts ‘答案:a‘
    end

end
puts ‘学生甲抄的试卷‘
student1 = TestPaperA.new
student1.question1
student1.question2
student1.question3

puts ‘学生乙抄的试卷‘
student2 = TestPaperB.new
student2.question1
student2.question2
student2.question3

存在的问题:

TestPaperA和TestPaperB中的代码很多相同的地方,不利于维护,如果需要修改题目的话,就要改两处改后的代码
# -*- encoding: utf-8 -*-

class TestPaper
    def question1
        puts ‘杨过得到,后来给了郭靖,炼成倚天剑,屠龙刀的玄铁可能是[]  a.球墨铸铁 b.马口铁 c.高速合金钢 d.碳塑纤维 ‘
    end

    def question2
        puts ‘杨过、程英、陆无双铲除了情花,造成了[] a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化  ‘
    end

    def question3
        puts ‘蓝凤凰的致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[] a.阿司匹林 b.牛黄解毒片 c.氟酸 d.让他们喝大量的生牛奶 e.以上全不对‘
    end
end

#学生甲的试卷类
class TestPaperA < TestPaper

    def question1
        super
        puts ‘答案:b‘
    end

    def question2
        super
        puts ‘答案:a‘
    end

    def question3
        super
        puts ‘答案:c‘
    end

end
#学生乙的试卷类
class TestPaperB < TestPaper

    def question1
        super
        puts ‘答案:d‘
    end

    def question2
        super
        puts ‘答案:b‘
    end

    def question3
        super
        puts ‘答案:a‘
    end

end
puts ‘学生甲抄的试卷‘
student1 = TestPaperA.new
student1.question1
student1.question2
student1.question3

puts ‘学生乙抄的试卷‘
student2 = TestPaperB.new
student2.question1
student2.question2
student2.question3

可以看出,抽取出来一个公共的试卷类,让甲乙去继承,公用其中的试题。这时再看TestPaperA和TestPaperB,不同的只有答案a、b、c、d不一样,其他的都一样。

# -*- encoding: utf-8 -*-

class TestPaper
    def question1
        puts ‘杨过得到,后来给了郭靖,炼成倚天剑,屠龙刀的玄铁可能是[]  a.球墨铸铁 b.马口铁 c.高速合金钢 d.碳塑纤维 ‘
        puts "答案:#{answer1}"
    end

    def question2
        puts ‘杨过、程英、陆无双铲除了情花,造成了[] a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化  ‘
        puts "答案:#{answer2}"
    end

    def question3
        puts ‘蓝凤凰的致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[] a.阿司匹林 b.牛黄解毒片 c.氟酸 d.让他们喝大量的生牛奶 e.以上全不对‘
        puts "答案:#{answer3}"
    end
    def answer1; end
    def answer2; end
    def answer3; end
end

#学生甲的试卷类
class TestPaperA < TestPaper

    def answer1
        ‘b‘
    end

    def answer2
        ‘a‘
    end

    def answer3
        ‘c‘
    end

end
#学生乙的试卷类
class TestPaperB < TestPaper

    def answer1
        ‘d‘
    end

    def answer2
        ‘b‘
    end

    def answer3
        ‘a‘
    end

end
puts ‘学生甲抄的试卷‘
student1 = TestPaperA.new
student1.question1
student1.question2
student1.question3

puts ‘学生乙抄的试卷‘
student2 = TestPaperB.new
student2.question1
student2.question2
student2.question3

这里将TestPaperA和TestPaperB中的答案抽离到了父类中,仅仅保存不同的部分。

父类成为子类的模板,所有重复的代码都应该上升到父类去,而不是让每个子类都去重复。

当我们要完成在某一细节层次一致的过程或一系列步骤,但其个别步骤在更详细层次上的实现可能不同时,我们通常考虑使用模板方法模式来处理。

时间: 2024-12-28 21:31:41

《大话设计模式》ruby版代码:模板方法模式的相关文章

大话设计模式C++版——工厂方法模式

工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版--简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发-封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,不符合开放-封闭原则,那么工厂方法模式会在那方面有所改进呢?我们仍以简单工厂模式中加减法计算器为例. 1.保持简单工厂模式的 IOperation 接口和实现对象(COperation_Add 和 COperation_

大话设计模式C++版——抽象工厂模式

前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种--抽象工厂模式(Abstract Factory),其是在工厂方法模式的基础上改进而来,如果没有弄明白工厂方法模式的同学请先观看<大话设计模式C++版--工厂方法模式>. 为什么会有抽象工厂模式?抽象工厂模式是简单工厂模式缺陷的终极解决方式么?NO,抽象工厂模式并不是为了解决简单工厂模式的缺陷而活着,它是因为有新的使命而诞生. 一个简单的例

大话设计模式C++版——简单工厂模式

简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类--依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class IOperation { public: IOperation() : m_nNuml(0), m_nNumr(0) {} virtual ~IOperation() {} virtual void SetNum(int nNuml = 0, int nNumr = 0) { m_nNuml = nN

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]

模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override).   1  2{<HeadFirst设计模式>之模板方法模式 }  3{ 编译工具: Delphi7.0              }  4{ E-Mail : [email protected]      }  5  6unit uCoffeineBeverageWithHook;  7  8interface  9 10uses 11  SysUtils; 12 13type 14  TCoffei

大话设计模式读书笔记--7.模板方法模式

有时候,我们会遇到由一系列步骤构成的过程,这个过程从高层次上看是相同的,但有些步骤的实现可能不同,我们就要考虑使用模板方法 生活中的例子:坐交通工具上班,  A开车,B做公交, 交通工具就是一个抽象模板 定义 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类不改变算法的结构,即可重定义该算法的某些特定步骤 模式结构 AbstractClass:是一个抽象模板类,templateMethod()是模板方法,它是一个顶级逻辑的骨架,primitiveOperation()是一个

大话设计模式C++版——工厂模式在COM中的典型应用

上篇<大话设计模式C++版--抽象工厂模式>中,我们拯救世界未遂,留下小小的遗憾,本篇中我们将给出一个解决方案--COM组件技术,同时也顺便扯扯工厂模式在COM组件技术中的应用. 工厂模式违背开放-封闭原则的根本原因在于对象的产生无法通过客户模块外的数据进行控制,如果我们能从xml.注册表.配置文件中写入一个类的名字,然后模块从中读出类名,并根据读出的类名创建对象,那不就和C#高大上的反射技术一样牛B哄哄了.非常幸运,微软的COM组件技术就提供了这么一个平台. 1.COM组件是神马 为了节约篇

大话设计模式C++版——代理模式

本篇开始前先发个福利,程杰的<大话设计模式>一书高清电子版(带目录)已上传至CSDN,免积分下载. 下载地址:http://download.csdn.net/detail/gufeng99/8843487 代理模式是一种比较简单但却实用的设计模式,他可以灵活的更换代理的对象,但保证功能的完整性,就如卖衣服的代理商,他可以代理美特斯邦威的衣服,如果美特斯邦威的衣服被大家吐槽不好卖了,他还可以换去代理卖佐丹奴的,但不管怎么更换,还是能满足大家的需求--买衣服. 下面以大话设计模式书中的例子为例,

大话设计模式C++版——表驱动法改造简单工厂

上回<大话设计模式C++版--简单工厂模式>中指出了简单工厂模式的缺陷,即违背了开发-封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,如何改造switch结构,表驱动法就可以粉墨登场了. 表驱动法的介绍见<数据驱动编程之表驱动法>. 1.面向接口编程,先改造抽象接口类IOperation class IOperation { public: IOperation() : m_nNuml(0), m_nNumr(0) {} vi

《Head First 设计模式》学习笔记——模板方法模式

模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 设计模式 模板方法模式:在一个方法中定义一个算法的框架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结果的情况下,重新定义算法中的某些步骤. 模板就是一个方法,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现.这样可以确

大话设计模式读书笔记2——策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合. UML 图: 根据<大话设计模式>——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式: /// <summary> /// 现金收费抽象类 /// </summary> public abstract class CashSuper { /// <summary> ///