设计模式二十四讲之《模版方法模式》

定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模版方法模式通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。
使用时机: 将公共要用到的方法提取到父类,将需要改变的值或方法写成可重写的,通过继承将共同的方法传递到子类,然后再通过重写改变具体的需要改变的值得到最后想要的结果。其实和继承多态一个逻辑


  class Program
    {
        static void Main(string[] args)
        {
            //AbstractClass c;               //原始的模版方法模式           

            //c = new ConcreteClassA();                                                     //执行步骤:1.申明但不实例化AbstractClass的对象c;
            //c.TemplateMethod();                                                           //          2.实例化具体的继承于AbstractClass的类ConcreteClassA/ConcreteClassB并传给你c,然后c执行TemplateMethod方法,TemplateMethod的方法有AbstractClass
                                                                                            //            中两个方法的具体实现。输出结果。
            //c = new ConcreteClassB();
            //c.TemplateMethod();

            //Console.ReadKey();


            TestPaper testPaperA = new TestPaperA();   //带例子的演示                      //执行步骤:1.声明TestPaper对象testPaperA/testPaperB,并将继承于其的子类TestPaperA/TestPaperB实例化给它。
            testPaperA.TestQuestion1 ();                                                   //          2.testPaperA/testPaper执行TestQuestion1、TestQuestion2、TestQuestion3方法,由于父类中TestQuestion1、TestQuestion2、TestQuestion3方法中的answer
            testPaperA.TestQuestion2();                                                    //            在子类中有重写,故最后输出的结果是子类重写父类中的Answer方法,然后结合TestQuestion输出的。
            testPaperA.TestQuestion3();

            TestPaper testPaperB = new TestPaperB();
            testPaperB.TestQuestion1();
            testPaperB.TestQuestion2();
            testPaperB.TestQuestion3();

            Console.ReadKey();
        }
    }

abstract  class AbstractClass
    {
        public abstract void PrimitiveOperation1();
        public abstract void PrimitiveOperation2();

        public void TemplateMethod()
        {
            PrimitiveOperation1();
            PrimitiveOperation2();
            Console.WriteLine("");
        }
    }

    class ConcreteClassA : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("具体类A方法1实现");
        }

        public override void PrimitiveOperation2()
        {
            Console.WriteLine("具体类A方法2实现");
        }
    }
    class ConcreteClassB : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("具体类B方法1实现");
        }

        public override void PrimitiveOperation2()
        {
            Console.WriteLine("具体类B方法2实现");
        }
    }

 class TestPaper
    {
        public void TestQuestion1()
        {
            Console.WriteLine("毛毛都的无聊生活测试问题:1");
            Console.WriteLine("答案是"+ Answer1());
        }
        public void TestQuestion2()
        {
            Console.WriteLine("毛毛都的无聊生活测试问题:2");
            Console.WriteLine("答案是" + Answer2());
        }
        public void TestQuestion3()
        {
            Console.WriteLine("毛毛都的无聊生活测试问题:3");
            Console.WriteLine("答案是" + Answer3());
        }
        public virtual string Answer1()
        {
            return "";
        }
        public virtual string Answer2()
        {
            return "";
        }
        public virtual string Answer3()
        {
            return "";
        }
    }
    class TestPaperA : TestPaper
    {
        public override string Answer1()
        {
            return "A";
        }
        public override string Answer2()
        {
            return "B";
        }
        public override string Answer3()
        {
            return "C";
        }
    }
    class TestPaperB : TestPaper
    {
        public override string Answer1()
        {
            return "D";
        }
        public override string Answer2()
        {
            return "A";
        }
        public override string Answer3()
        {
            return "B";
        }
    }

转载请注明出处!!!

欢迎加入951815219群聊,共享知识,讨论交流~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值