• 模板方法模式


    模板方法模式

    在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

    优点:

    1. 封装不变部分,扩展可变部分。
    2. 提取公共代码,便于维护。
    3. 行为由父类控制,子类实现。

    缺点:

    每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

    使用场景:

    1. 有多个子类共有的方法,且逻辑相同。
    2. 重要的、复杂的方法,可以考虑作为模板方法。

    类图如下

    模板方法模式

    实例代码

    package com.jack.idea.test.designmode;
    
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    
    /**
     * 模板方法模式
     *
     * @author ljs.song
     * @date 2018-01-02 15:22
     */
    public class Template {
        public static void main(String[] args) {
            Calendar calendar = Calendar.getInstance();
    
            //季度分享电影短片开始 顺序回顾每个人的分享流程
            ShareTemp xiaojieShare = new XiaoJieShare();
            xiaojieShare.share(calendar.getTime(),"三楼接待室");
    
            ShareTemp xiaochenshare = new XiaoChenShare();
            calendar.set(Calendar.DAY_OF_MONTH,10);
            xiaochenshare.share(calendar.getTime(),"总裁办公室");
    
            ShareTemp xiaolongShare = new XiaoLongShare();
            calendar.set(Calendar.HOUR_OF_DAY,23);
            xiaolongShare.share(calendar.getTime(),"宇宙中心");
        }
    }
    
    /**
     * 分享模板抽象类
     */
    abstract class ShareTemp{
    
        private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH");
    
        private Date date;
        private String location;
    
        public void share(Date date,String location){
            //步骤1 首先预定时间和场地
            getTime(date,location);
            //步骤2 开始真正的分享
            shareContent();
            //步骤3 分享结束,讨论并关闭投影仪
            end();
        }
    
        /**
         * 步骤1 ,预定时间和地点 当然这些也可以作为抽象方法
         */
        private void getTime(Date date,String location){
            System.out.println("1. 我想在" + SIMPLE_DATE_FORMAT.format(date) + " ,在" + location + "发起分享,欢迎来看");
        }
    
        /**
         * 需要子类具体实现
         */
        abstract void shareContent();
    
        private void end(){
            System.out.println("3. 我今天的分享到这里,谢谢大家");
            System.out.println("*************关闭投影****************************");
        }
    }
    
    /**
     * 小杰分享
     */
    class XiaoJieShare extends ShareTemp{
    
        @Override
        void shareContent() {
            System.out.println("2. 我今天分享的内容是设计模式");
        }
    }
    
    /**
     * 小龙分享
     */
    class XiaoLongShare extends ShareTemp{
    
        @Override
        void shareContent() {
            System.out.println("2. 我今天分享的内容是自动化测试");
        }
    }
    
    /**
     * 小臣分享
     */
    class XiaoChenShare extends ShareTemp{
    
        @Override
        void shareContent() {
            System.out.println("2. 我今天分享的内容是变成规范之我见");
        }
    }
    

    转载请注明出处 阿布的夏天

  • 相关阅读:
    maven(一)maven自带的插件
    Faster RCNN 的细节补充
    leetcode 287
    一句话介绍python线程、进程和协程
    C++中指针和引用的区别
    C++ operator new和new operator的区别
    Faster RCNN算法训练代码解析(3)
    Faster RCNN算法训练代码解析(2)
    Faster RCNN算法训练代码解析(1)
    Faster RCNN算法demo代码解析
  • 原文地址:https://www.cnblogs.com/jackslj/p/11541007.html
Copyright © 2020-2023  润新知