1. 程式人生 > 程式設計 >模板方法模式

模板方法模式

模板方法模式

在模板模式(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. 我今天分享的內容是變成規範之我見");
    }
}複製程式碼

轉載請註明出處 阿布的夏天