zoukankan      html  css  js  c++  java
  • 模版方法模式 展现程序员的一天

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/26276093

    继续设计模式~ 模版方法模式

    老套路,先看下定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。

    简单看下定义,模版方法定义了一个算法的步骤,并且允许子类为一个或多个步骤提供实现。定义还算清晰,下面来个例子展示下本公司的上班情况(纯属娱乐,如有雷同,请对号入座)。简单描述一下:本公司有程序猿、测试、HR、项目经理等人,下面使用模版方法模式,记录下所有人员的上班情况:

    首先来个超类,超类中定义了一个workOneDay方法,设置为作为算法的骨架:

    package com.zhy.pattern.template;
     
    public abstract class Worker
    {
        protected String name;
     
        public Worker(String name)
        {
            this.name = name;
        }
     
        /**
         * 记录一天的工作
         */
        public final void workOneDay()
        {
     
            System.out.println("-----------------work start ---------------");
            enterCompany();
            computerOn();
            work();
            computerOff();
            exitCompany();
            System.out.println("-----------------work end ---------------");
     
        }
     
        /**
         * 工作
         */
        public abstract void work();
     
        /**
         * 关闭电脑
         */
        private void computerOff()
        {
            System.out.println(name + "关闭电脑");
        }
     
        /**
         * 打开电脑
         */
        private void computerOn()
        {
            System.out.println(name + "打开电脑");
        }
     
        /**
         * 进入公司
         */
        public void enterCompany()
        {
            System.out.println(name + "进入公司");
        }
     
        /**
         * 离开公司
         */
        public void exitCompany()
        {
            System.out.println(name + "离开公司");
        }
     
    }

    定义了一个上班(算法)的骨架,包含以下步骤:

    a、进入公司

    b、打开电脑

    c、上班情况

    d、关闭电脑

    e、离开公司

    可以看到,a、b、d、e我们在超类中已经实现,子类仅实现work这个抽象方法,记录每天的上班情况。下面各类屌丝入场:

    程序猿:

    package com.zhy.pattern.template;
     
    public class ITWorker extends Worker
    {
     
        public ITWorker(String name)
        {
            super(name);
        }
     
        @Override
        public void work()
        {
            System.out.println(name + "写程序-测bug-fix bug");
        }
     
    }
    package com.zhy.pattern.template;
     
    public class HRWorker extends Worker
    {
     
        public HRWorker(String name)
        {
            super(name);
        }
     
        @Override
        public void work()
        {
            System.out.println(name + "看简历-打电话-接电话");
        }
     
    }
    package com.zhy.pattern.template;
     
    public class QAWorker extends Worker
    {
     
        public QAWorker(String name)
        {
            super(name);
        }
     
        @Override
        public void work()
        {
            System.out.println(name + "写测试用例-提交bug-写测试用例");
        }
     
    }

    下面我们测试下:

    package com.zhy.pattern.template;
     
    public class Test
    {
        public static void main(String[] args)
        {
     
            Worker it1 = new ITWorker("鸿洋");
            it1.workOneDay();
            Worker it2 = new ITWorker("老张");
            it2.workOneDay();
            Worker hr = new HRWorker("迪迪");
            hr.workOneDay();
            Worker qa = new QAWorker("老李");
            qa.workOneDay();
            Worker pm = new ManagerWorker("坑货");
            pm.workOneDay();
     
        }
    }

    输出结果:

    -----------------work start ---------------
    鸿洋进入公司
    鸿洋打开电脑
    鸿洋写程序-测bug-fix bug
    鸿洋关闭电脑
    鸿洋离开公司
    -----------------work end ---------------
    -----------------work start ---------------
    迪迪进入公司
    迪迪打开电脑
    迪迪看简历-打电话-接电话
    迪迪关闭电脑
    迪迪离开公司
    -----------------work end ---------------
    -----------------work start ---------------
    老李进入公司
    老李打开电脑
    老李写测试用例-提交bug-写测试用例
    老李关闭电脑
    老李离开公司
    -----------------work end ---------------
    -----------------work start ---------------
    坑货进入公司
    坑货打开电脑
    坑货打dota...
    坑货关闭电脑
    坑货离开公司
    -----------------work end ---------------

    好了,恭喜你,又学会一个设计模式,模版方法模式。

    下面看下模版方法模式类图,和我们程序的类图:

    模版方式里面也可以可选的设置钩子,比如现在希望记录程序员离开公司的时间,我们就可以在超类中添加一个钩子:

        public boolean isNeedPrintDate()
        {
            return false;
        }
        /**
         * 离开公司
         */
        public void exitCompany()
        {
            if (isNeedPrintDate())
            {
                System.out.print(new Date().toLocaleString()+"-->");
            }
            System.out.println(name + "离开公司");
        }
    package com.zhy.pattern.template;
     
    public class ITWorker extends Worker
    {
     
        public ITWorker(String name)
        {
            super(name);
        }
     
        @Override
        public void work()
        {
            System.out.println(name + "写程序-测bug-fix bug");
        }
     
        @Override
        public boolean isNeedPrintDate()
        {
            return true;
        }
        
    }

    最后再看下测试结果:

    -----------------work start ---------------
    鸿洋进入公司
    鸿洋打开电脑
    鸿洋写程序-测bug-fix bug
    鸿洋关闭电脑
    2014-5-19 19:17:05-->鸿洋离开公司
    -----------------work end ---------------
  • 相关阅读:
    .Net下的MSMQ(微软消息队列)的同步异步调用
    [收藏]JS获取网页中HTML元素的几种方法分析
    在FireFox下设为首页的解决方法
    如何创建和使用Web Service代理类
    [收藏]61条面向对象设计的经验原则
    [总结]DotNet中用到的加密算法总结
    如何把用SQL语句int型整数转换成二进制数
    彻底杜绝PHP的session,cookie,Cannot modify header错误
    MSN总是报80048820的错误,网上搜的一些资料解决不了,我找到了真正解决办法!
    [收藏]MD5加密的javascript实现
  • 原文地址:https://www.cnblogs.com/cjjjj/p/13578362.html
Copyright © 2011-2022 走看看