設計模式(二十二)模板方法

来源:https://www.cnblogs.com/WinterSir/p/17573994.html
-Advertisement-
Play Games

一、定義 定義一個操作中演算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類不改變一個演算法的結構即可重定義該演算法的特定步驟。模板方法是一種類行為型模式 二、描述 模板方法模式結構比較簡單,其核心是抽象類和其中的模板方法的設計,包含以下兩個角色: 1、AbstractClass(抽象類):在抽象 ...


一、定義

定義一個操作中演算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類不改變一個演算法的結構即可重定義該演算法的特定步驟。模板方法是一種類行為型模式

二、描述

模板方法模式結構比較簡單,其核心是抽象類和其中的模板方法的設計,包含以下兩個角色:
1、AbstractClass(抽象類):在抽象類中定義了一系列基本操作(Primitive Operations),這些基本操作可以是具體的,也可以是抽象的,每一個基本操作對應演算法的一個步驟,在其子類中可以重新定義或實現這些步驟。同時,在抽象類中實現了一個模板方法(Template Method),用於定義一個演算法的框架。
2、ConcreteClass(具體子類):抽象類的子類,用於實現在父類中聲明的抽象基本操作以完成子類特定演算法的步驟,也可以覆蓋在父類中已經實現的具體基本操作。

三、例子

X公司欲為某銀行的業務支撐系統開發一個利息計算模塊,利息計算流程如下:
(1)系統根據賬號和密碼驗證用戶信息,如果用戶信息錯誤,系統顯示錯誤提示。
(2)如果用戶信息正確,則根據用戶類型的不同使用不同的利息計算公式計算利息(例如活期賬戶和定期賬戶具有不同的利息計算公式)
(3)系統顯示利息。

Account:抽象類

public abstract class Account
{
    // 基本方法 - 具體方法
    public bool Validate(string account, string password)
    {
        Console.WriteLine("賬號 : {0}", account);
        Console.WriteLine("密碼 : {0}", password);

        if (account.Equals("張無忌") && password.Equals("123456"))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    // 基本方法 - 抽象方法
    public abstract void CalculateInterest();

    // 基本方法 - 具體方法
    public void Display()
    {
        Console.WriteLine("顯示利息");
    }

    // 基本方法 - 鉤子方法
    public virtual bool IsAllowDisplay()
    {
        return true;
    }

    // 模板方法
    public void Handle(string account, string password)
    {
        if (!Validate(account, password))
        {
            Console.WriteLine("賬戶或密碼錯誤,請重新輸入!");
            return;
        }

        CalculateInterest();

        if (IsAllowDisplay())
        {
            Display();
        }
    }
}

CurrentAccount、SavingAccount:活期存款、定期存款,充當具體子類

public class CurrentAccount : Account
{
    // 重寫父類的抽象基本方法
    public override void CalculateInterest()
    {
        Console.WriteLine("按活期利率計算利息!");
    }

    // 重寫父類的鉤子方法
    public override bool IsAllowDisplay()
    {
        return base.IsAllowDisplay();
    }
}

public class SavingAccount : Account
{
    // 重寫父類的抽象基本方法
    public override void CalculateInterest()
    {
        Console.WriteLine("按定期利率計算利息!");
    }

    // 重寫父類的鉤子方法
    public override bool IsAllowDisplay()
    {
        return false;
    }
}

Program:測試代碼

Account account = new CurrentAccount();
if (account != null)
{
    account.Handle("張無忌", "123456");
}
Console.ReadLine();

四、總結

1、優點

(1)在父類中形式化地定義一個演算法,而由它的子類來實現細節的處理,在子類實現詳細的處理演算法時並不會改變演算法中步驟的執行次序。
(2)模板方法模式是一種代碼復用技術,在類庫設計中尤為重要,它提取了類庫中的公共行為,將公共行為放在父類中,而通過其子類來實現不同的行為,它鼓勵用戶恰當地使用繼承來實現代碼復用。
(3)模板方法模式可實現一種反向控制結構,通過子類覆蓋父類的鉤子方法來決定某一特定步驟是否需要執行。
(4)在模板方法模式中可以通過子類來覆蓋父類的基本方法,不同的子類可以提供基本方法的不同實現,更換和增加新的子類很方便,符合單一職責原則和開閉原則。

2、缺點

(1)模板方法模式需要為每一個基本方法的不同實現提供一個子類,如果父類中可變的基本方法太多,將會導致類的個數增加,系統會更加龐大,設計也會更加抽象,此時,可結合橋接模式來進行設計。

測試簽名
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述:在C#中,字元串連接有兩種實現方法:使用`+`運算符和使用`StringBuilder`。前者在每次連接時都會創建新的字元串對象,效率較低。後者通過內部管理字元數組,避免了頻繁的記憶體分配和垃圾回收,因此性能更高。在處理大量字元串連接時,使用`StringBuilder`可以顯著提高性能。這兩種 ...
  • DevToys —— 號稱是開發人員的“瑞士軍刀”,一款適用於開發者的工具集合,包含各種實用的開發小工具。JSON格式化、文本對比、正則表達式...無需網路,離線即可使用! ...
  • Linux 是一個嚴謹的操作系統,每個目錄存放什麼文件是有明確的要求和規範的。我們應該去瞭解這些目錄的作用,然後按照目錄要求去操作。 ...
  • 一、海豚調度介紹 Apache DolphinScheduler 是一個分散式易擴展的可視化DAG工作流任務調度開源系統。適用於企業級場景,提供了一個可視化操作任務、工作流和全生命周期數據處理過程的解決方案。 Apache DolphinScheduler 旨在解決複雜的大數據任務依賴關係,併為應用 ...
  • 下麵介紹三種用於進行排序的專用視窗函數: 1、RANK() 在計算排序時,若存在相同位次,會跳過之後的位次。 例如,有3條排在第1位時,排序為:1,1,1,4······ 2、DENSE_RANK() 這就是題目中所用到的函數,在計算排序時,若存在相同位次,不會跳過之後的位次。 例如,有3條排在第1 ...
  • 在近日舉辦的鴻蒙生態千帆啟航儀式上,華為常務董事、終端BG CEO餘承東表示,鴻蒙生態設備已經增至8億 ,將打開萬億產業新藍海。 在本次論壇上,華為宣佈HarmonyOS NEXT鴻蒙星河版(開發者預覽版)已面向開發者開放申請。該版本,能夠實現原生精緻、原生易用、原生流暢、原生安全、原生智能、原生互 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 依賴管理解決了在軟體開發過程中管理和協調各種依賴項的問題,簡化了開發流程,提高了項目的可靠性、可維護性和可重覆性。它們幫助開發人員更高效地管理項目的依賴關係,減少了潛在的錯誤和衝突,並提供了更好的開發體驗。 常用的依賴管理 在 JavaS ...
  • 最近,有群里在群里發了這麼一個非常有意思的卡片 Hover 動效,來源於此網站 -- key-drop,效果如下: 非常有意思酷炫的效果。而本文,我們不會完全還原此效果,而是基於此效果,嘗試去製作這麼一個類似的卡片交互效果: 該效果的幾個核心點: 卡片的 3D 旋轉跟隨滑鼠移動效果 如何讓卡片在 H ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...