C#设计模式之模板方法模式

前言

感觉模板方法模式和原型有些一样的地方,以后会再次进行分析和总结。这篇博客主要来介绍模板方法模式的使用和代码展示。

模板方法模式

what

模板方法模式通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势,提供了一个很好的代码复用平台,降低了耦合度。

情景

考试要做的选择题。大家的试卷内容都是一样的,只不过大家给出的答案在abcd中可能不同,这时就可以选择用模板方法模式来进行,编写一个试卷类,然后有具体试卷来继承试卷类就可以了。具体试卷的答案各不相同,但是试卷的内容是一样的

应用

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

代码展示

试卷类:

 class TestQuestion       //试卷类
    {
        public void TestQuestion1()
        {
            Console.WriteLine("郭倩是?性格的人?[] a.可爱 b.聪明 c. 善良 d.以上全对+无敌");
            Console.WriteLine("答案:" + Answer1());//将答案改成一个虚方法
        }

        protected virtual string Answer1()   //此方法的目的就是给继承的子类重写,因为这里每个人的答案都是不同的。
        {
            return "";
        }

        //同上!!!
        public void TestQuestion2()
        {
            Console.WriteLine("刘木同是?性格的人?[] a.帅气 b.睿智 c. 负责人 d.以上全不对+无敌");
            Console.WriteLine("答案:" + Answer1());//将答案改成一个虚方法
        }

        public void TestQuestion3()
        {
            Console.WriteLine("哈哈是?性格的人? []a.可爱 b.聪明 c. 善良 d.以上全不 对+无敌");
            Console.WriteLine("答案:" + Answer1());//将答案改成一个虚方法
        }

        protected virtual string Answer2()
        {
            return "";
        }

        protected virtual string Answer3()
        {
            return "";
        }
    }

A同学试卷:

 class TestPaperA:TestQuestion 
    {
        //重写虚方法后,把答案填上,其他的不用写了。因为父类建立了所有的重复的模板
        protected override string Answer1()
        {
            return "d";
        }

        protected override string Answer2()
        {
            return "d";
        }

        protected override string Answer3()
        {
            return "d";
        }
    }

B同学试卷:—同A

class TestPaperB:TestQuestion 
    {
        protected override string Answer1()
        {
            return "d";
        }

        protected override string Answer2()
        {
            return "c";
        }

        protected override string Answer3()
        {
            return "a";
        }
    }

客户端代码:

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("学生A抄的试卷");
            TestQuestion studentA = new TestPaperA();
            studentA.TestQuestion1();
            studentA.TestQuestion2();
            studentA.TestQuestion3();

            Console.WriteLine("学生B抄的试卷");
            TestQuestion studentB = new TestPaperB();
            studentB.TestQuestion1();
            studentB.TestQuestion2();
            studentB.TestQuestion3();

            Console.Read();
        }
    }

效果展示:

模板

后记

看这个模式真是看的脑袋晕晕的,不过实在迷糊了,建议跟着错的敲一遍,一点一点改,总会明白的!

猜你喜欢

转载自blog.csdn.net/carrie_q/article/details/80530543
今日推荐