java設計模式之模板方法模式

来源:http://www.cnblogs.com/liaoweipeng/archive/2016/08/20/5790395.html
-Advertisement-
Play Games

模板方法模式 定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。 模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。通俗的說的就是有很多相同的步驟的,在某一些地方可能有一些差別適合於這種模式,如大話設計模式中說到的考試場景中,每個人的試卷都是一樣的,只有答案不一樣。這種場景 ...


模板方法模式

  定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。 模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。通俗的說的就是有很多相同的步驟的,在某一些地方可能有一些差別適合於這種模式,如大話設計模式中說到的考試場景中,每個人的試卷都是一樣的,只有答案不一樣。這種場景就適合於模板方法模式。我這次自己寫的是一個汽車啟動的過程,每一種汽車啟動的過程都基本是一樣的流程,無非是這一過程中存在一些細小差別。

模板方法模式UML圖

  

模板方法模式代碼

package com.roc.template;
/**
 * 汽車模型
 * 模型模式
 * @author liaowp
 *
 */
public abstract class CarModel {
     /**
      * 汽車啟動
      */
     protected abstract void start();
    
     /**
      * 停車
      */
     protected abstract void stop();
     
     /**
      * 用戶並不需要關註你的車怎麼啟動或者停下來的,可以開可以停就可以啦
      */
     final public void excet(){
         this.start();
         this.stop();
     }
}
package com.roc.template;
/**
 * 大眾車
 * @author liaowp
 *
 */
public class Wcar extends CarModel{

    @Override
    protected void start() {
        System.out.println("大眾車啟動 。。。。。。。。突突突");
    }

    @Override
    protected void stop() {
        System.out.println("大眾車停車。。。。。。。。。");
    }
}
package com.roc.template;

public class Ocar extends CarModel{

    @Override
    protected void start() {
        System.out.println("奧迪  無匙啟動               突突突");
    }

    @Override
    protected void stop() {
        System.out.println("奧迪  停車              ");
    }

}
package com.roc.template;
/**
 * 客戶端
 * @author liaowp
 *
 */
public class Client {
    public static void main(String[] args) {
        CarModel wcar=new Wcar();//家裡的第一輛車,作為用戶的我們並不需要關註車怎麼啟動的.子類變數變為父類。多態
        wcar.excet();
        
        //突然家裡需要第二輛車了   奧迪     我們也不需要關註他怎麼生產啟動的    
        CarModel ocar=new Ocar();
        ocar.excet();
    }
}

模板方法模式適用場景

  • 一次性實現一個演算法的不變的部分,並將可變的行為留給子類來實現。
  • 各子類中公共的行為應被提取出來並集中到一個公共父類中以避免代碼重覆。這是Opdyke和Johnson所描述過的“重分解以一般化”的一個很好的例子。首先識別現有代碼中的不同之處,並且將不同之處分離為新的操作。最後,用一個調用這些新的操作的模板方法來替換這些不同的代碼。
  • 控制子類擴展。模板方法只在特定點調用“hook”操作,這樣就只允許在這些點進行擴展。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 處理事情: 數據處理過程中,速度很慢,無法準確定位分析是DB問題還是客戶端處理問題,所以增加計時統計日誌; Delphi計時首次使用,查閱資料,予以記錄: ...
  • 現在程式員愈發的不容易了,想要精通,必然要尋本溯源,這其實與目前泛濫的愈發高級的語言以及眾多的框架剛好相反,因為它們在儘可能的掩蓋本源使其簡單,個人稱之為程式員學習悖論。 註:作者接觸web開發和php兩周左右,以下內容適合初學者。 1、導讀 從文題目看,<簡單PHP會話(Session)說明> 是 ...
  • 作為一個剛入門編程的大一狗,第一次寫博客,希望能對自己學的知識進行鞏固和提升,也希望記錄自己成長的過程。 學習Python,一是因為暑假學的c++頭疼,聽說Python簡單,那我就試試吧,二是因為Python形勢一片大好,算是附和潮流吧! 一、初識Python 1、第一個Python代碼 依然是熟悉 ...
  • 上面是系統定義的,比較枯燥,下麵是自己寫的代碼: 執行過程就是:窗體創建(給OnPositionChange賦值)--點擊button(讀取edt1中的值) 之後調用setposition(也許這就是綁定好的了吧) DOPositionchange 執行FOnPositionChange(也就是On ...
  • 應用場景: 微信授權登錄過程中,需要用戶確認,故衍生此需求; 相應的邏輯不放在前端的原因是,此部分邏輯屬於偏功能業務,所以放在後端,方便統一管理。 解決辦法: 通過php echo出javascript腳本,這裡需要關註的一點是緩衝區。 緩衝區應該是有三個部分,分別是php、webserver、we ...
  • 在開發過程中,經常需要和別的系統交換數據,數據交換的格式有XML、JSON等,JSON作為一個輕量級的數據格式比xml效率要高,XML需要很多的標簽,這無疑占據了網路流量,JSON在這方面則做的很好,下麵先看下JSON的格式, JSON可以有兩種格式,一種是對象格式的,另一種是數組對象, 從上面的兩 ...
  • Java compiler level does not match the version of the installed java project facet錯誤的解決 因工作的關係,Eclipse開發的Java項目拷來拷去,有時候會報一個很奇怪的錯誤。明明源碼一模一樣,為什麼項目複製到另一臺 ...
  • 定義變數 在Python中,定義一個變數是很簡單的。而且,在Python中,定義是不需要用分號結尾的。例如: 判斷語句 Pyhon的if判斷語句是由if、elif、else組成,每個判斷都是由:結尾。Python的判斷也是非常簡單的。 迴圈 在python中,是不支持直接的字元串拼接數值的。如果想要 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...