日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

模板设计模式示例

發布時間:2023/12/3 asp.net 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模板设计模式示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文是我們名為“ Java設計模式 ”的學院課程的一部分。

在本課程中,您將深入研究大量的設計模式,并了解如何在Java中實現和利用它們。 您將了解模式如此重要的原因,并了解何時以及如何應用模式中的每一個。 在這里查看 !

目錄

1.簡介 2.什么是模板設計模式 3.實施模板設計模式 4.在模板內部引入一個掛鉤 5.何時使用模板設計模式 6. JDK中的模板模式 7.下載源代碼

1.簡介

模板設計模式是一種行為模式,顧名思義,它提供了供用戶使用的模板或算法結構。 用戶無需改變算法的結構即可提供自己的實現。

在問題的幫助下更容易理解這種模式。 我們將在本節中了解場景,并在下一節中使用Template模式實施解決方案。

您是否曾經使用Java應用程序連接到關系數據庫? 讓我們回想一下連接數據并將數據插入數據庫所需的一些重要步驟。 首先,根據要連接的數據庫,需要一個驅動程序。 然后,我們將一些憑據傳遞給數據庫,然后,準備一條語句,將數據設置到insert語句中,然后使用insert命令將其插入。 稍后,我們關閉所有連接,并有選擇地銷毀所有連接對象。

無論任何供應商的關系數據庫,您都需要編寫所有這些步驟。 考慮一個問題,您需要將一些數據插入不同的數據庫。 您需要從CSV文件中獲取一些數據,然后將其插入MySQL數據庫中。 一些數據來自文本文件,應將其插入Oracle數據庫中。 唯一的區別是驅動程序和數據,其余步驟應該相同,因為JDBC提供了一組通用的接口來與任何供應商的特定關系數據庫進行通信。

我們可以創建一個模板,該模板將為客戶端執行一些步驟,并留下一些步驟讓客戶端以自己的特定方式實現它們。 (可選)客戶端可以覆蓋某些已定義步驟的默認行為。

現在,在實現代碼之前,讓我們進一步了解模板設計模式。

2.什么是模板設計模式

模板模式定義了操作中算法的框架,將某些步驟推遲到子類。 模板方法允許子類在不更改算法結構的情況下重新定義算法的某些步驟。

模板方法模式可以在存在算法的情況下使用,其中某些步驟可以以多種不同方式實現。 在這種情況下,模板方法模式建議將算法的大綱保留在一個類(稱為模板類)內的稱為模板方法的單獨方法中,而忽略變體部分的具體實現(步驟該算法可以針對此類的不同子類以多種不同方式實現)。

Template類不一定必須將實現全部留給子類。 而是,作為提供算法概述的一部分,Template類還可以提供一定數量的實現,這些實現可以視為在不同實現之間是不變的。 如果合適,它甚至可以為變體部件提供默認實現。 在不同的子類中將僅實現特定的細節。 這種實現方式消除了對重復代碼的需求,這意味著要編寫的代碼量最少。

圖1

抽象類

  • 定義具體的子類定義的抽象基本操作,以實現算法的步驟。
  • 實現定義算法框架的模板方法。 模板方法調用原始操作以及在AbstractClass定義的操作或其他對象的操作。
    ConcreteClass
  • 實現原始操作進行。

3.實施模板設計模式

在下面,我們可以看到連接模板類,該類用于為客戶端提供一個用于連接各種數據庫并與之通信的模板。

package com.javacodegeeks.patterns.templatepattern;public abstract class ConnectionTemplate {public final void run() {setDBDriver();setCredentials();connect();prepareStatement();setData();insert();close();destroy();}public abstract void setDBDriver();public abstract void setCredentials();public void connect() {System.out.println("Setting connection...");}public void prepareStatement() {System.out.println("Preparing insert statement...");}public abstract void setData();public void insert() {System.out.println("Inserting data...");}public void close() {System.out.println("Closing connections...");}public void destroy() {System.out.println("Destroying connection objects...");} }

抽象類提供了連接,通信以及稍后關閉連接的步驟。 必須完成所有這些步驟才能完成工作。 該類為某些常見步驟提供了默認實現,并將特定步驟保留為抽象,從而迫使客戶端為其提供實現。

用戶應該實現setDBDriver方法以提供特定于數據庫的驅動程序。 對于不同的數據庫,憑據可能不同; 因此, setCredentials也保留為抽象狀態,以使用戶可以實現它。

同樣,使用JDBC API連接到數據庫并準備語句是很常見的。 但是,數據將是特定的,因此用戶將提供它,而其他步驟(如運行插入語句,關閉連接和銷毀對象)則與任何數據庫相似,因此它們的實現在模板內保持通用。

上一類的關鍵方法是run方法。 run方法用于按順序運行這些步驟。 該方法被設置為最終方法,因為這些步驟應保持安全,并且任何用戶都不得更改。

下面的兩個類擴展了模板類,并為某些方法提供了特定的實現。

package com.javacodegeeks.patterns.templatepattern;public class MySqLCSVCon extends ConnectionTemplate {@Overridepublic void setDBDriver() {System.out.println("Setting MySQL DB drivers...");}@Overridepublic void setCredentials() {System.out.println("Setting credentials for MySQL DB...");}@Overridepublic void setData() {System.out.println("Setting up data from csv file....");} }

上面的類用于連接到MySQL數據庫,并通過讀取CSV文件提供數據。

package com.javacodegeeks.patterns.templatepattern;public class OracleTxtCon extends ConnectionTemplate {@Overridepublic void setDBDriver() {System.out.println("Setting Oracle DB drivers...");}@Overridepublic void setCredentials() {System.out.println("Setting credentials for Oracle DB...");}@Overridepublic void setData() {System.out.println("Setting up data from txt file....");} }

上面的類用于連接到Oracle數據庫,并通過讀取文本文件來提供數據。

現在,讓我們測試代碼。

package com.javacodegeeks.patterns.templatepattern;public class TestTemplatePattern {public static void main(String[] args) {System.out.println("For MYSQL....");ConnectionTemplate template = new MySqLCSVCon();template.run();System.out.println("For Oracle...");template = new OracleTxtCon();template.run();} }

上面的代碼將導致以下輸出:

For MYSQL.... Setting MySQL DB drivers... Setting credentials for MySQL DB... Setting connection... Preparing insert statement... Setting up data from csv file.... Inserting data... Closing connections... Destroying connection objects... For Oracle... Setting Oracle DB drivers... Setting credentials for Oracle DB... Setting connection... Preparing insert statement... Setting up data from txt file.... Inserting data... Closing connections... Destroying connection objects...

上面的輸出清楚地顯示了模板模式如何使用類似的方式與不同的數據庫連接和通信。 該模式將通用代碼保留在一個類下,并提高了代碼的可重用性。 它為用戶設置了一個框架并對其進行控制,并允許用戶擴展模板,以便為某些步驟提供特定的實現。

現在,如果我們通過添加日志記錄機制來增強上述示例。 但是代碼的某些用戶不想添加此功能,要實現此功能,我們可以使用鉤子。 掛鉤是模板類內部具有默認行為的簡單方法; 此行為可用于更改一些可選步驟。 用戶應實現此方法,該方法可以掛接到模板類內部以更改算法的可選步驟。

4.在模板內部引入一個掛鉤

讓我們用鉤子增強上面的示例。

package com.javacodegeeks.patterns.templatepattern;import java.util.Date;public abstract class ConnectionTemplate {private boolean isLoggingEnable = true;public ConnectionTemplate() {isLoggingEnable = disableLogging();}public final void run() {setDBDriver();logging("Drivers set [" + new Date() + "]");setCredentials();logging("Credentails set [" + new Date() + "]");connect();logging("Conencted");prepareStatement();logging("Statement prepared [" + new Date() + "]");setData();logging("Data set [" + new Date() + "]");insert();logging("Inserted [" + new Date() + "]");close();logging("Conenctions closed [" + new Date() + "]");destroy();logging("Object destoryed [" + new Date() + "]");}public abstract void setDBDriver();public abstract void setCredentials();public void connect() {System.out.println("Setting connection...");}public void prepareStatement() {System.out.println("Preparing insert statement...");}public abstract void setData();public void insert() {System.out.println("Inserting data...");}public void close() {System.out.println("Closing connections...");}public void destroy() {System.out.println("Destroying connection objects...");}public boolean disableLogging() {return true;}private void logging(String msg) {if (isLoggingEnable) {System.out.println("Logging....: " + msg);}} }

我們在上述模板類中引入了兩個新方法。 disableLogging是一個返回boolean的鉤子。 默認情況下,啟用日志記錄的布爾值isLoggingEnable為true。 如果應該為他的代碼禁用日志記錄,則用戶可以覆蓋此方法。 另一種是用于記錄消息的私有方法。

下面的類實現了hook方法并返回false,從而關閉了此特定工作的日志記錄機制。

package com.javacodegeeks.patterns.templatepattern;public class MySqLCSVCon extends ConnectionTemplate {@Overridepublic void setDBDriver() {System.out.println("Setting MySQL DB drivers...");}@Overridepublic void setCredentials() {System.out.println("Setting credentials for MySQL DB...");}@Overridepublic void setData() {System.out.println("Setting up data from csv file....");}@Overridepublic boolean disableLogging() {return false;} }

讓我們測試一下這段代碼。

package com.javacodegeeks.patterns.templatepattern;public class TestTemplatePattern {public static void main(String[] args) {System.out.println("For MYSQL....");ConnectionTemplate template = new MySqLCSVCon();template.run();System.out.println("For Oracle...");template = new OracleTxtCon();template.run();} }

上面的類將導致以下輸出:

For MYSQL.... Setting MySQL DB drivers... Setting credentials for MySQL DB... Setting connection... Preparing insert statement... Setting up data from csv file.... Inserting data... Closing connections... Destroying connection objects... For Oracle... Setting Oracle DB drivers... Logging....: Drivers set [Sat Nov 08 23:53:47 IST 2014] Setting credentials for Oracle DB... Logging....: Credentails set [Sat Nov 08 23:53:47 IST 2014] Setting connection... Logging....: Conencted Preparing insert statement... Logging....: Statement prepared [Sat Nov 08 23:53:47 IST 2014] Setting up data from txt file.... Logging....: Data set [Sat Nov 08 23:53:47 IST 2014] Inserting data... Logging....: Inserted [Sat Nov 08 23:53:47 IST 2014] Closing connections... Logging....: Conenctions closed [Sat Nov 08 23:53:47 IST 2014] Destroying connection objects... Logging....: Object destoryed [Sat Nov 08 23:53:47 IST 2014]

您可以在輸出中清楚地看到,對于MySQL實現,日志記錄已關閉,而對于Oracle實現,日志記錄已關閉。

5.何時使用模板設計模式

在以下情況下應使用模板方法模式:

  • 一次實現算法的不變部分,然后將其留給子類來實現可以變化的行為。
  • 子類之間的共同行為應分解并集中在一個共同類中,以避免代碼重復。 您首先要確定現有代碼中的差異,然后將差異分為新的操作。 最后,將不同的代碼替換為調用這些新操作之一的模板方法。
  • 控制子類擴展。 您可以定義一個模板方法,該方法在特定點調用“掛鉤”操作(請參閱結果),從而僅允許在這些點進行擴展。

6. JDK中的模板模式

  • java.util.Collections#sort()
  • java.io.InputStream#skip()
  • java.io.InputStream#read()
  • java.util.AbstractList#indexOf()

7.下載源代碼

這是有關模板設計模式的課程。 您可以在此處下載源代碼: TemplatePattern-Project

翻譯自: https://www.javacodegeeks.com/2015/09/template-design-pattern.html

總結

以上是生活随笔為你收集整理的模板设计模式示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。