码迷,mamicode.com
首页 > 其他好文 > 详细

【模板模式】 Template Pattern

时间:2014-08-11 14:43:22      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   for   ar   

模板模式 又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤(这个我觉得很抽象,很抽象)


e:学会说“不”,把时间用在更重要的事情上


案例:在一组监控的程序中,我们需要记录程序启动和结束一些信息(日志能通过上下文的信息根据约定自动生成)

bubuko.com,布布扣
 //Ingore the unreasonable class name, just for presentation
    public abstract class BaseClass
    {
        protected void LogStart()
        {
            Console.WriteLine("Log Start Infomation");
        }

        protected void LogEnd()
        {
            Console.WriteLine("Log End Infomation");
        }

        public abstract void DoWork();

    }


    public class FirstSubClass : BaseClass
    {
        public void Execute()
        {
            base.LogStart();

            DoWork();

            base.LogEnd();
        }

        public override void DoWork()
        {
            Console.WriteLine(this.GetType().Name + "Do Work");
        }
    }
View Code

这里的不当之处在哪里?如你所见,子类负责在Execute()方法执行中的特定点调用基类,这样导致子类的编写人员需要记住这些方法,并在合适的时候调用(子类程序员好累有木有,要记住好多东西),另外一个不当之处,如果我们并不想子类能隐藏或者重写我们的日志记录,这里就会有一个隐患出现:

bubuko.com,布布扣
 public class FirstSubClass : BaseClass
    {
        protected new void LogStart()
        {
            Console.WriteLine("111Log Start Infomation");
        }
        public void Execute()
        {
            LogStart();

            DoWork();

            LogEnd();
        }

        public override void DoWork()
        {
            Console.WriteLine(this.GetType().Name + "Do Work");
        }
    }
View Code

我们重写了一下子类,用new关键字把父类的LogStart()方法隐藏了,这样的话我们调用的时候会直接调用子类的LogStart()。我们用模板模式来解决一下这两个问题:

bubuko.com,布布扣
   //Ingore the unreasonable class name, just for presentation
    public abstract class BaseClass
    {
        private void LogStart()
        {
            Console.WriteLine("Log Start Infomation");
        }

        private void LogEnd()
        {
            Console.WriteLine("Log End Infomation");
        }

        public abstract void DoWork();
        public void Execute()
        {
            LogStart();

            DoWork();

            LogEnd();
        }

    }


    public class FirstSubClass : BaseClass
    {

        public override void DoWork()
        {
            Console.WriteLine(this.GetType().Name + "Do Work");
        }
    }
View Code

我们把LogStart(),LogEnd()的权限都设置成private,这样子类就不能改变我们固定的算法了(这是完全根据业务需求来决定),把Execute提到父类,让父类来控制流程,而只让子类填写可变的算法(函数),我们子类编写人员只要根据父类的限定(abstract的方法)来编写对应的算法就好了,这样在写单元测试的时候也更加的单一化,只需要对子类自身实现的算法进行有效性测试就可以了。

 

若有不对,不足之处请指出,请不要只写一个:漏洞百出此类评价,谢谢大家的指点和帮助!

 

【模板模式】 Template Pattern,布布扣,bubuko.com

【模板模式】 Template Pattern

标签:style   blog   http   color   os   io   for   ar   

原文地址:http://www.cnblogs.com/guochenkai/p/3904498.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!