模板方法模式在学生出操点名的应用

简介: 1、现象分析 全国各个大、中、小学都有早上让学生出操的习惯。常常有部分同学不愿意出动,经常缺席早操早锻炼。因此,教务处每天都要实施早操点名汇报制度。 一个学校往往有多个年级、年级里有多个班。

1、现象分析

全国各个大、中、小学都有早上让学生出操的习惯。常常有部分同学不愿意出动,经常缺席早操早锻炼。因此,教务处每天都要实施早操点名汇报制度。

一个学校往往有多个年级、年级里有多个班。当各班班长清点完人数后,向领导汇报人数时的格式基本一样,即:

XXX班有多少人,实到多少人,未到多少人,XXX班长YYY,报到完毕!

 

2、模板方法模式在学生出操点名的应用

可以考虑利用模板方法,将其实现。

UML图如下:

 

image 图1 基本结构图


如图1,基类CClassInfo中定义了三个方法:

ReportRegistInfoTemplate()是一个模式方法,用来调用所定义的虚方法;

GetGradeNum()和ShowReporterName()是两个虚方法,必须由派生类进行实现。

 

案例代码如下:

class Program 
   { 
       static void Main(string[] args) 
       { 
           Console.WriteLine("各年级、各班开始汇报出操人数:\\n"); 
           CClassInfo classInfo = new CGrade1ClassInfo(1, 80, 78); 
           classInfo.ReportRegistInfoTemplate(); 
           classInfo = new CGrade1ClassInfo(2, 82, 77); 
           classInfo.ReportRegistInfoTemplate();
           classInfo = new CGrade2ClassInfo(1, 86, 75); 
           classInfo.ReportRegistInfoTemplate(); 
           classInfo = new CGrade2ClassInfo(2, 90, 85); 
           classInfo.ReportRegistInfoTemplate();
           classInfo = new CGrade3ClassInfo(1, 100, 95); 
           classInfo.ReportRegistInfoTemplate(); 
           classInfo = new CGrade3ClassInfo(2, 88, 82); 
           classInfo.ReportRegistInfoTemplate();
           Console.ReadLine(); 
       }
        public class CClassInfo 
       { 
           public int CassNo; 
           public int TotalStuNumber; 
           public int ActualPreset; 
           public CClassInfo(int classNo, int totalStuNumber, int actualPresent) 
           { 
               CassNo = classNo; 
               TotalStuNumber = totalStuNumber; 
               ActualPreset = actualPresent; 
           }
            //  模板方法里面也两个虚方法进行调用 
           public void ReportRegistInfoTemplate() 
           { 
               Console.WriteLine(" {0}年级 {1}班:总人数{2}人,实到人数{3}人,{4}人未到。", 
                                           GetGradeNum(),this.CassNo,this.TotalStuNumber,this.ActualPreset, 
                                           (this.TotalStuNumber-this.ActualPreset)); 
               this.ShowReporterName(); 
           }
           /* 定义一个虚方法留在子类实现 */ 
           public virtual string GetGradeNum() 
           { 
               return ""; 
           }
           public virtual void ShowReporterName() 
           { 
               Console.WriteLine(""); 
           } 
       }
       ///  
       /// 具体的模板角色 
       /// 实现所定义的一个或多个虚(或抽象)方法。 
       /// 每一个模板方法可以任意个实现 
       ///  
       public class CGrade1ClassInfo : CClassInfo 
       {   
           int gradeNo = 1;
           public CGrade1ClassInfo(int classNo, int totalStuNumber, int actualPresent) 
               : base(classNo,totalStuNumber,actualPresent) 
           { }
           public override string GetGradeNum() 
           { 
               return gradeNo.ToString(); 
           }
           public override void ShowReporterName() 
           { 
               Console.WriteLine("                  一年级{0}班长Kobe{1},报告完毕!\\n", base.CassNo,base.CassNo); 
           } 
       }
       public class CGrade2ClassInfo : CClassInfo 
       { 
           int gradeNo =2;
           public CGrade2ClassInfo(int classNo, int totalStuNumber, int actualPresent) 
               : base(classNo,totalStuNumber,actualPresent) 
           { }
           public override string GetGradeNum() 
           { 
               return gradeNo.ToString(); 
           }
           public override void ShowReporterName() 
           { 
               Console.WriteLine("                  二年级{0}班长James{1},报告完毕!\\n", base.CassNo, base.CassNo); 
           } 
       }
       public class CGrade3ClassInfo : CClassInfo 
       { 
           int gradeNo = 3;
           public CGrade3ClassInfo(int classNo, int totalStuNumber, int actualPresent) 
               : base(classNo,totalStuNumber,actualPresent) 
           { }
           public override string GetGradeNum() 
           { 
               return gradeNo.ToString(); 
           }
           public override void ShowReporterName() 
           { 
               Console.WriteLine("                  三年级{0}班长Durant{1},报告完毕!\\n", base.CassNo, base.CassNo); 
           } 
       } 
   }

运行效果如下:

image

图2 出操情况汇报

在main()函数中调用时,我们只是重复使用了下面的语句

CClassInfo classInfo = new CGrade1ClassInfo(1, 80, 78);

classInfo.ReportRegistInfoTemplate();


根据不同的对象,创建不同的实例,再通过大家统一的模板方法接口:

            public void ReportRegistInfoTemplate()
           {
               Console.WriteLine(" {0}年级 {1}班:总人数{2}人,实到人数{3}人,{4}人未到。",
                                           GetGradeNum(),this.CassNo,this.TotalStuNumber,this.ActualPreset,
                                           (this.TotalStuNumber-this.ActualPreset));
               this.ShowReporterName();
           }

从而避免了大量重复(相似)的方法在派生类中多次实现的问题。

 

上面案例印证了下面的观点:

模板方法模式通过把不变行为搬移到超类,去除子类中的重复代码。


案例源码

img_e25d4fb2f8de1caf41a735ec53088516.pngStudentCheckInSystem.zip

相关文章
|
测试技术 持续交付 开发工具
《Git 简易速速上手小册》第6章:Git 在持续集成/持续部署(CI/CD)中的应用(2024 最新版)
《Git 简易速速上手小册》第6章:Git 在持续集成/持续部署(CI/CD)中的应用(2024 最新版)
278 2
|
小程序
微信小程序实现上拉加载分页列表的性能优化
微信小程序实现上拉加载分页列表的性能优化
|
11月前
|
消息中间件 API 开发工具
云速搭助力用友 BIP 平台快速接入阿里云产品
通过与阿里云合作,用友 BIP 集成了多款云产品,实现了快速集成、稳定可靠的一体化解决方案,显著提升了企业资源管理效率和业务灵活性。
215 102
|
10月前
|
SEO
如何自己搭建一个网站?
通过安装简单的CMS网站管理系统或自助建站系统,快速建立网页。步骤包括域名注册、资料实名制、网站建模、内容修改、SEO配置和上线。网站质量可通过后台更新和维护提升。
460 10
|
传感器 存储 物联网
单片机的原理与应用
单片机是一种将计算机的CPU、存储器、输入输出接口等功能集成在一块芯片上的微型计算机,被广泛应用于各类控制系统和智能设备中。
624 5
|
测试技术 API 微服务
单元测试的5个关键问题
1. 背景关于“什么是单元测试”、“为什么要做单元测试”、“怎么做单元测试”,网络上相关的技术文章汗牛充栋。尽管如此,在推广单元测试的过程,通过与研发同学的交流,我发现大家对单元测试的探讨还是存在薄弱的地方。这个薄弱的地方既不是抽象的单元测试理论,也不是具体的单元测试技术,而是理论与实践相结合的单元测试策略。就像测试策略一样,单元测试策略决定了我们能否把单元测试真正做好(而不是流于形式),并且让单
|
前端开发 Swift iOS开发
探索iOS开发的未来:SwiftUI和Combine的融合
在iOS开发领域,SwiftUI和Combine框架的出现标志着一个新时代的到来。本文深入探讨这两个框架如何共同推动iOS应用开发的现代化,通过具体案例分析它们的优势、挑战以及未来趋势。
|
算法 关系型数据库 MySQL
【MySQL系列】-ORDER BY……HAVING详解及limit
文章目录 创建学校联考成绩表 一、obder by…… having…… 1.格式: 2.作用: 3.使用: 4.使用细节: 二、limit 1. limit的格式: 2. limit的作用: 3.使用:
|
SQL 分布式计算 数据处理
实时计算 Flink版产品使用问题之怎么将数据从Hive表中读取并写入到另一个Hive表中
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
555 0