模板方法模式

模板方法模式:

简单的来说模板方法模式是将子类中重复、不变的代码搬移到超类中;

定义一个操作中算法的骨架,而将一些步骤延迟到子类中;使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。如下面这份十分”主观“的试卷,试题是不变的,变得是答案,所以模板方法闪亮登场——将试题、选项抽象一个父类:AbstractClass,两个子类TestpaperA、B继承他。

 class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("\n学生Cindy的试卷");
            //将子类声明改成了父类,利用多态、代码复用
            TestPaper studentA = new TestPapeerA();
            studentA.TestQuestion1();
            studentA.TestQuestion2();
            studentA.TestQuestion3();

            Console.WriteLine("\n学生Phil的试卷");
            TestPaper studentB = new TestPapeerB();
            studentB.TestQuestion1();
            studentB.TestQuestion2();
            studentB.TestQuestion1();

            Console.Read();
        }
    }
    class TestPaper
    {
       public void TestQuestion1()//给出逻辑骨架,抽象行为
        {
            Console.WriteLine("你对现在小说的看法[ ] \n a.很烂b.还行c.很棒");
            Console.WriteLine("答案"+Answer1());
        }
        //虚方法,为了给继承的子类重写、实现
        protected virtual string Answer1()
       {
           return "";
       }
        public void TestQuestion2()
       {
           Console.WriteLine("\n 郭敬明和韩寒具有可比性吗? \n a.Y b.N C.I don't care");
           Console.WriteLine("答案" + Answer2());
       }
        protected virtual string Answer2()
        {
            return "";
        }
        public void TestQuestion3()
        {
            Console.WriteLine("\n 你喜欢韩寒吗? \n a.Y b.N c.Sometimes ");
            Console.WriteLine("答案" + Answer3());
        }
        protected virtual string Answer3()
        {
            return "";
        }
    }

    class TestPapeerA : TestPaper // 实现方式A
    {
        protected override string Answer1()//重写方法
        {
            return "c";
        }
        protected override string Answer2()
        {
            return "a";
        }
        protected override string Answer3()
        {
            return "b";
        }
    }
    class TestPapeerB : TestPaper//实现方式B
    {
        protected override string Answer1()//抽象实现
        {
            return "a";
        }
        protected override string Answer2()
        {
            return "a";
        }
        protected override string Answer3()
        {
            return "b";
        }
    }

结构图

模板方法模式_第1张图片

          当我们需要完成某细节层次一致的过程或步骤,但其中个别步骤在更详细的层次上的实现可能不同时,模板方法模式是一个不错的选择。

之前学习了原型模式(链接),两者有一些相似的地方,比较下:

原型模式:原型实例指定创建对象的种类,然后通过拷贝原型创建新对象;

模板方法模式:是将子类中重复不变的行为搬移到父类,去除子类中重复的代码。


你可能感兴趣的:(设计模式,模板方法模式)