模板方法模式——题号都抄错了

简介: 模板方法模式——题号都抄错了

模板方法模式(TemplateMethod)定义: 定义一个操作中的算法的骨架,将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。


 优点:


子类实现算法的某些细节,有助于算法的扩展。

通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

很好的实现了代码复用,把不变的行为放置到超类中,去除子类的重复。

缺点:

每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

 适用场景:


在某些类的算法中,用了相同的方法,造成代码的重复。

控制子类扩展,子类必须遵守算法规则。

 例子背景: 家教老师要给两个学生出同一套题,两个学生太笨题目都分不清顺序,没办法老师要求再考一次,并且让学生把题目(题号)先写下来。


试卷类:

class TestPaper   //给出了逻辑骨架,具体实现留到了子类中
    {
        public void TestQuestion1()
        {
            Console.WriteLine("考题1的答案是[ ]a. b. c. d.");
            Console.WriteLine("答案:"+Answer1());
        }
        public void TestQuestion2()
        {
            Console.WriteLine("考题2的答案是[ ]a. b. c. d.");
            Console.WriteLine("答案:" + Answer2());
        }
        public void TestQuestion3()
        {
            Console.WriteLine("考题3的答案是[ ]a. b. c. d.");
            Console.WriteLine("答案:" + Answer3());
        }
    //逻辑的组成是一些抽象的操作,虚方法为了让子类重写自己的答案
        protected virtual string Answer1()
        {   
            return "";
        }
        protected virtual string Answer2()
        {
            return "";
        }
        protected virtual string Answer3()
        {
            return "";
        }
    }

学生甲的试卷:

    class TestPaperA:TestPaper    //同学甲、乙可以有不同的实现方法
    {
        protected override string Answer1()
        {
            return "b";
        }
        protected override string Answer2()
        {
            return "c";
        }
        protected override string Answer3()
        {
            return "a";
        }
    }

学生乙的试卷:

    class TestPaperB : TestPaper
    {
        protected override string Answer1()
        {
            return "b";
        }
        protected override string Answer2()
        {
            return "c";
        }
        protected override string Answer3()
        {
            return "b";
        }
    }

客户端:

        static void Main(string[] args)
        {
            Console.WriteLine("学生甲的试卷");
            //这里使用多态,将子类对象转成父类对象,方便使用父类的方法,实现了代码复用
            TestPaper studentA = new TestPaperA();
            studentA.TestQuestion1();
            studentA.TestQuestion2();
            studentA.TestQuestion3();
            Console.WriteLine("学生乙的试卷");
            TestPaper studentB = new TestPaperB();
            studentB.TestQuestion1();
            studentB.TestQuestion2();
            studentB.TestQuestion3();
            Console.ReadLine();
        }
相关文章
甚么!!你这麽传参是吧,好好
甚么!!你这麽传参是吧,好好
58 0
|
4月前
|
监控 安全 网络安全
别偷懒!这些事你必须知道!
在数字化时代,SSL证书作为保护网站数据传输安全的关键工具,其重要性不言而喻。然而,安装SSL证书并非一劳永逸,它需要定期续签以确保持续的安全保护。续签不仅能提升安全性、确保合规性,还能优化用户体验。通常续签过程包括检查有效期、选择CA、提交申请、安装新证书及验证安装等步骤。提前规划、备份旧证书和设置监控提醒是续签过程中需要注意的事项。
|
9月前
|
人工智能 Java BI
一篇文章讲明白MartianAddition
一篇文章讲明白MartianAddition
45 0
|
Python Windows
你真的看得懂报错吗?
你真的看得懂报错吗?
345 0
你真的看得懂报错吗?
|
存储 数据安全/隐私保护 Python
一文让你完全弄懂Stegosaurus(下)
一文让你完全弄懂Stegosaurus(下)
183 0
一文让你完全弄懂Stegosaurus(下)
|
缓存 Python
一文让你完全弄懂Stegosaurus(上)
一文让你完全弄懂Stegosaurus
217 0
一文让你完全弄懂Stegosaurus(上)
|
缓存 JSON JavaScript
面试官:你有多少种方法实现对象深拷贝?手撕一下代码!
前言 深拷贝问题是一道老生常谈的前端面试题了。为什么要实现深拷贝大家也一定明白,作为一个程序员,值类型和引用的类型的区别大部分人应该都是知道的。面试官问这道题的道理也很简单,就是考虑你的基础知识是否牢固。很多小伙伴可能只知道个概念,或者大概知道有哪些方法,总是云里雾里的感觉。今天我们就好好理一理如何实现深拷贝!
487 0
面试官:你有多少种方法实现对象深拷贝?手撕一下代码!
|
Web App开发 Ubuntu JavaScript
我好像明白了什么.....
谷歌浏览器是最流行的网络浏览器,无论你是否喜欢使用它,Chrome都毋庸置疑提供良好的用户体验。 尽管它可用于Linux,但它并不是一个开源的网络浏览器。
我好像明白了什么.....
函数式接口原理都讲烂了,还不来了解...
大家好,函数式接口的应用篇已经给大家讲完,今天,指北君和大家一同深入探索Java实现函数式接口的原理。本篇将从编译,执行层面为大家讲解函数式接口运行的机制,让各位小伙伴更进一步加深对函数式接口的理解
函数式接口原理都讲烂了,还不来了解...
|
JavaScript Java 编译器
方法调用:一看就懂,一问就懵?
方法调用:一看就懂,一问就懵?
111 0
方法调用:一看就懂,一问就懵?