模板方法模式——最好的复用

来源:互联网 发布:手机淘宝如何申请试用 编辑:程序博客网 时间:2024/06/05 07:31

概念:

定义一个算法骨架,实现步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。


解释说明:

1.模板方法模式就是定义一个不变的模板,即框架是一定的,但是内容具体细节可能会不一样。

2.把不变的行为搬移到超类,去除子类中重复代码,让子类来实现。

3.我们用的时候只是用这个重复不变的模板,这叫继承,然而让子类去实现它,子类表现不一样,即是多态。


举例,为什么要使用模板方法模式:

像我们考试的时候,只有选择题,并且要求我们抄题,如果是100个人,会抄100分,然后填上答案,显然是种很笨拙的方式,并且还很容易抄错,那怎么办?我们可以只写一份,然后让每一个人打印100份,然后填上答案也可以,但是这样要让每一个在做题的时候都进行一遍打印的操作,对于学生来说显然也是种重复的工作,如果再来一个学生还需要打印一遍题,然后写上答案。 有没有更好的办法啦?当然有啦?我们发现学生除了打印试卷,然后填上答案,这些操作是重复的相同的之外,不同的只是答案的选项不一样, 现在我们就开始想着,不让学生去打印卷子了,直接给他们一个模板,让他们直接填写上答案就OK. 下一个同学来了,也是一样,只不过是在试卷的模板上填写选择题的选项答案,这是每个人的试卷的唯一的不同,省去了很多重复的工作。                        

结构图:


在父类中定义一个模板方法,给出了逻辑骨架,其中各个子类的不同的地方定义了虚方法,让子类去重写去实现。


核心代码:

试卷父类,定义试卷模板

  class TestPaper    {        //考题试卷        //试题1        public void TestQuestion1()        {            Console.WriteLine("杨过得到,后来给了郭靖,炼成倚天剑,屠龙刀的玄铁可能是[] a.球磨铸铁 b.马口铁 c.高速合钢铁 d.碳素纤维");            Console.WriteLine("答案:"+Answer1());        }


因为每个学生不同的只是答案,所以把答案定义为虚方法,让不同的子类即(学生)去重写,即去具体实现

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


学生甲重写虚方法的实现
 //学生甲抄的试卷    class TestPaperA:TestPaper    {        protected override string Answer1()        {            return "b";        }

适用性:

我感觉是只是在某一层次的细节上的实现有一点区别,其他都一样,这时我们可以定义一个父类模板,让子类直接去实现就可以了。


联想到在机房上的应用:

当我们登录系统的时候,直接输入账号和密码就可以直接登录,这个过程可以用到模板方法,在父类中定义用户账号和密码的虚方法,让不同的用户去具体实现,把重复的部分全部提到了父类中。

总结:

模板方法就是把相同的部分全部移动到父类中,把不同的细节定义一个虚方法,只是让子类去实现不同的部分。


0 0