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

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

模板方法模式(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();
        }
目录
打赏
0
0
0
0
5
分享
相关文章
代码为什么那么乱! 换种方法学面向对象
我们经常会为一个问题寻找多种不同的解决方案。当你评估不同的算法和数据结构时,通常会设计几种不同的方案,它们在性能和内存的使用上不尽相同。通过评估不同的方案,最终合理地优化应用程序,这是一种重要的面向对象设计技巧。
5526 0
一目了然!谁能想到Java多线程设计模式竟然被图解,看完不服不行
多线程设计模式在Java编程中起着至关重要的作用,它能够有效提高程序的执行效率,使得程序在处理大量数据和复杂任务时更加高效。然而,对于初学者来说,理解和应用多线程设计模式可能是一项相当具有挑战性的任务。为了让读者更加轻松地掌握这一复杂主题,我们带着一种全新的图解方式,深入剖析Java多线程设计模式的精髓。
看到他我一下子就悟了-- 泛型(2)
先说些题外话,只所以写这些东西。是看了CSDN上的曹版主的一篇:手把手教编程,不知道有没有人愿意参与。说实话,我工作四年,总感觉晕晕乎乎的,好多技术都 懂,但是没有一项是精通的。看了这篇帖子,说实在话我可想去,去聆听大神的教导。
816 0
看到他我一下子就悟了-- 泛型(1)
1.泛型概念:       本质上,术语”泛型”指的是”参数化类型(parameterized types)”.参数化类型非常重要,因为它们可以在创建类.结构.方法和委托的时候将要操作的数据类型作为参 数进行指定.使用参数化类型的类.结构.方法和委托都可以称为泛型,如”泛型类”或者”泛型方法”.        在具体声明一个变量或者实例化之前,类型参数T只是一个占位符。
681 0
看到他我一下子就悟了-- Lambda表达式
一直对Lambda表达式似懂非懂,平常也用过,就是不太明白有时候还要百度。周六去图书馆看书,看到下面这几句话,一下子就悟了: Lambda表达式(匿名函数),基本形式:(intput paramters)=〉expressiona.
645 0
故意把代码写得很烂,这样的 “防御性编程“ 可取吗?
故意把代码写得很烂,这样的 “防御性编程“ 可取吗?
110 3
又烧脑又炫技还没什么用,在代码里面打印自身
又烧脑又炫技还没什么用,在代码里面打印自身
237 0
又烧脑又炫技还没什么用,在代码里面打印自身

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等