TEMPLATE METHOD 模式

2023-10-27

Template Method 模式使用继承,来分离通用的算法和具体的上下文。

简单的讲,我有一个冒泡排序的程序,用来对int 型数据排序,要想对double 类型的数据排序,可能又得重新编写一个排序程序。Template Method 模式则避免了这种冗余的做法,它将通用的算法过程抽象出来,形成抽象基类,然后不同的算法采用自己的继承子类实现。

冒泡排序抽象基类:
public abstract class BubbleSorter
{
  public void doSort()
  {
     for(...)
        for(...)
        {
            if( outOfOrder(index) )
                  swap(index);
         }
   }

   protected abstract void swap(int index);
   protexted abstract boolean outOfOrder(int index);
}

int 型排序子类:
public IntBubbleSorter extends BubbleSorter
{
    int[] array;

    public void sort(int[] theArray)
    {
       array = theArray;
       doSort();
    }

    @override
     protected void swap(int index)
     {
         ...// 交换元素代码
     }

    @override
    protexted abstract boolean outOfOrder(int index)
    {
         return (array[index] > array[index + 1]);
     }
}

这样继承了基类中的排序通用算法,仅实现了比较元素和元素交换的部分功能。

Template Method 模式展示了面向对象编程中许多经典重用形式中的一种,通用算法放在基类中,通过集成在不同的具体上下文环境中实现该算法。

缺点:派生类不可避免同基类绑定在一起,依赖性太强。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TEMPLATE METHOD 模式 的相关文章

  • tkinter 应用程序中的 super()

    我无法理解这个错误 在下面的代码中 当我使用tk Frame一切都按预期进行 但是如果我使用super 我被抛出了AttributeError 应用程序对象没有属性 tk class Application tk Frame def ini
  • 在python中访问超级(父)类变量

    我是Python新手 我尝试使用 super 方法访问子类中的父类变量 但它抛出错误 无参数 使用类名访问类变量是可行的 但我想知道是否可以使用 super 方法访问它们 class Parent object props a str a
  • 在 Delphi XE 中将类作为过程的参数传递

    我需要做的是这样的 procedure A type of form var form TForm begin form type of form Create application form showmodal freeandnil f
  • 为什么可以从 console.log 访问 JavaScript 私有方法

    我写了一个简单的代码 const secure new class privateProperty 4 privateMethod console log The property this privateProperty should n
  • 非静态字段、方法或属性需要对象引用

    我知道人们以前问过这个问题 但场景太具体 我对基本原理感到困惑 我有两个基本版本的 C 程序 一种有效 一种无效 如果有人能解释为什么我收到错误 我会很高兴非静态字段 方法或属性需要对象引用在第二个程序中 Works namespace E
  • 如何为带有继承的 C++ 类编写 C 包装器

    我只是想知道是否有一种方法可以为具有继承的 C 类创建 C 包装 API 考虑以下 class sampleClass1 public sampleClass public int get return this data 2 void s
  • 类、模块、它们的特征类和方法查找

    我们来开公开课吧Module并向其中添加一个方法 class Module def foo puts phew end end 我可以通过这样做来调用这个方法 Class foo 这是可以理解的 因为类Class is Class 其超类是
  • C++类名冲突

    我现在正在做一个项目 需要整合两个子项目 项目A是用C 编写的 项目B是用C编写的 一个问题是 在项目B中 有一个名为vector它是由其作者创建的 在项目 A 中 std vector in STL用来 因为项目B以后可能会更新 所以我不
  • 如何在 Angular 2 应用程序中从 TypeScript/JavaScript 中的字符串获取类?

    在我的应用程序中 我有这样的内容 user ts export class User 现在 我这样做 应用程序组件 ts callAnotherFunction User 如果我将类名作为字符串 即 我该如何做到这一点 User 如果可能的
  • C++:获取器和设置器?

    我正在尝试编写一些代码来为以下数据的 ID 号 名字 姓氏 期中成绩和期末成绩创建 getter 和 setter 这些数据位于我正在编写的班级的文本文件中 10601 ANDRES HYUN 88 91 94 94 89 84 94 84
  • 内联函数以及类和头文件

    头文件中定义的任何函数都会自动内联吗 如果我在类中声明一个函数并使用关键字 inline 在外部给出定义 那么这个函数会是内联的吗 如果是 为什么这不违反内联函数应在声明时赋予主体的法律 类定义中定义的任何函数都是内联的 任何标记的功能in
  • 使类只能从特定类实例化

    假设我有 3 节课class1 class2 and class3 我怎样才能拥有它class1只能通过实例化class2 class1 object new class1 但不是 class3 或任何其他类 我认为它应该与修饰符一起使用
  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • 为什么我无法访问打字稿类的构造函数中的抽象属性

    abstract class Route abstract readonly name string protected abstract pattern string public constructor Do something wit
  • Delphi - 如果没有创建类,为什么这个函数可以工作?

    考虑这个类 unit Unit2 interface type TTeste class private texto string public function soma a b integer string end implementa
  • 无法在类对象的 ArrayList 中存储值。 (代码已编辑)

    这基本上是一个 Java 代码转换器 它涉及一个 GUI 让用户输入类类型 名称和方法 为了存储值 我创建了一个类VirtualClass与ArrayList
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 防止在派生类中调用基类实现的接口方法 C#

    是否可以在基类中实现接口并允许在第一个派生类级别调用 覆盖已实现的方法 但阻止从任何进一步的派生类调用它 public interface IInterfaceSample bool Test public class Base IInte
  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练
  • PHP 中的静态类初始值设定项

    我有一个带有一些静态函数的辅助类 类中的所有函数都需要一个 重 初始化函数来运行一次 就好像它是一个构造函数 有实现这一目标的良好实践吗 我唯一想到的就是打电话init函数 如果它已经运行过一次 使用静态 initialized变种 问题是

随机推荐

  • ps2020闪退_Adobe Photoshop 2020总是打不开,闪退,怎么回事,解决方法

    尽管还没有到2020年 但adobe公司更新软件的步伐没有停止 adobe 2020全家桶系列软件已经发布 其中就包括大家最喜欢的图像设计大师Photoshop 2020 我在第一时间也给大家分享了Photoshop2020简体中文版 许多
  • 微分动态规划的基本思想

    吴恩达cs229第19课 微分动态规划这一部分 看了两遍才看明白 赶紧记下来 微分动态规划是基于LQR 线性二次型 的 后者能够比较简洁地计算最优策略 但要基于一个前提 就是 t 1 时刻的状态 是 t 时刻的状态和 t 时刻采取行为的线性
  • LaTeX常用语法查询(自用)

    文章目录 LaTex文档结构 添加作者 标题 日期 章节和段落 插入目录 插入数学公式 两种插入模式 上下标和空格 根式与分式 符号 括号 省略号 矩阵 插入图片 插入表格 编辑器 离线编辑 在线编辑 分点 itemize 参考文献插入链接
  • 使用golang的pprof包对程序进行性能分析

    golang提供pprof包 可以监控golang程序的堆栈 cpu的耗时等性能信息 下边就说一下这个pprof包的使用 1 首先是引入 在两个地方可以引入 net http pprof runtime prof 其中 net http p
  • 尺寸汇总

    尺寸汇总 获取视口的宽高 含滚动条 window innerWidth window innerHeight 不含滚动条 document documentElement clientWidth document documentEleme
  • python使用matplotlib实现折线图的绘制

    一 意义 数据可视化可以以简洁的方式呈现出数据 发现众多数据中隐藏的规律和意义 Matplotlib是一个数学绘图库 利用它可以制作简单的图表 散点图 折线图 然后 将基于漫步概念生成一个更有趣的数据集 根据一系列随机决策生成的图表 本文我
  • 数据结构(9)之带权图

    1 带权图中 边带有一个数字 叫做权 它可能代表距离 耗费 时间或其他意义 2 带权图用来最常解决的问题是最短路径问题 pps 3 带权图的最小生成树中有所有的顶点和连接它们的必要的边 且这些边的权值最小 4 优先级队列的算法可用于寻找带权
  • Andriod中如何新建lunch项

    Andriod编译过程一般为 1 source build envsetup sh 加载命令 在项目根目录下 purple code a A code20211126 sdm660 目录 备注 在envsetup sh里将执行vendor和
  • 微服务 - 搭建Consul集群服务,Consul配置中心

    传统配置文件的弊端 静态化配置 例如env文件 配置文件无法区分环境 配置文件过于分散 历史版本无法查看 配置中心如何解决的呢 配置中心的思路是把项目中的配置参数全部放在一个集中的地方来管理 并提供一套标准的接口 当各个服务需要获取配置的时
  • [报名中] 腾讯技术专家为你揭秘"音视频及融合通信技术"

    导语 6月29日 北京东直门亚朵S酒店 云 社区邀您参加 音视频及融合通信技术 沙龙活动 深度探讨音视频及融合通信技术的发展及实践 领略前沿 共创价值 数字多媒体技术的不断发展对音视频及融合通信技术提出了怎样的要求呢 本期沙龙将邀请腾讯技术
  • qt中使用QStringLiteral宏来实现带参数的输出

    叙述 在QStringLiteral宏中输入字符串 但是字符串中有些值想用变量来输出 直接上代码 qDebug lt
  • futter开发错误积累

    注 后面添加以倒序方式添加 26 错误 RangeError index Invalid value Not in inclusive range 0 7 8 指示您的数组索引是从即0到7 但您正在尝试访问不存在的第8个索引的值 25 错误
  • 2021全国职业技能大赛安徽省合肥市“网络空间安全赛项”赛题及赛题解析(超详细)

    2021年中职组 网络空间安全 赛项 一 合肥市竞赛任务书 二 任务书解析 三 不懂的可以私信博主 一 合肥市竞赛任务书 一 竞赛时间 8 00 11 00 共计3小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第 阶段
  • SG90舵机的使用

    1 SG90舵机官方数据 尺寸 21 5mmX11 8mmX22 7mm 重量 9克 1kg 1公斤 2斤 无负载速度 0 12秒 60度 4 8V 0 002s 度 堵转扭矩 1 2 1 4公斤 厘米 4 8V 使用温度 30 60摄氏度
  • dubbo消费者源码解析

    一 服务消费者核心类ReferenceBean public void afterPropertiesSet throws Exception if applicationContext null BeanFactoryUtils bean
  • C++中类型转化

    对象类型向上向下转化 对象转化是对象间的按成员赋值 有新的存储被分配 有新对象产生 类型指针向上向下转化 转化后没有得到引得对象 也可以说没有新的存储分配 我们只是通过一个小的 转化后的对象的大小 视角去看待这个对象 因此在诸如对象的释 放
  • 网络总结知识点(网络工程师必备)一

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有收获 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的绽放 树高千尺 落叶归根人生不易 人间真情 前言 本专栏为就业必修秘籍 技术分册 本张试读篇
  • 某程序员披露华为外包员工现状:工作氛围好,没有歧视,但转正后也不算正式员工?...

    有些想进互联网大厂的人在无法成为正式员工的时候 会通过成为外包员工的方式来曲线救国 但在互联网大厂中 外包员工和正式员工的差别待遇一直是比较热门的话题 最近 一个网友总结了华为外包和正式员工的区别 干货满满 先来看看 看完以后 许多人表示赞
  • iframe被拒绝_IFRAME权限被拒绝的解决方案

    iframe被拒绝 I was recently rolling my own AJAX upload script posting a form to a hidden IFRAME and using the load event to
  • TEMPLATE METHOD 模式

    Template Method 模式使用继承 来分离通用的算法和具体的上下文 简单的讲 我有一个冒泡排序的程序 用来对int 型数据排序 要想对double 类型的数据排序 可能又得重新编写一个排序程序 Template Method 模式