模板方法模式

869 阅读2分钟

模板方法模式

在模板模式(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. 我今天分享的内容是变成规范之我见");
    }
}

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