Java 中的外觀設計模式

外觀設計模式結構設計模式之一(例如適配器模式裝飾器模式)。外觀設計模式用於幫助客戶端應用輕鬆與系統互動。

外觀設計模式

根據GoF,《外觀設計模式》是:

為子系統中的一組接口提供統一的接口。外觀模式定義了一個更高層次的接口,使子系統更易於使用。

假設我們有一個應用程序,其中包含一組用於使用MySql/Oracle數據庫和生成不同類型報表(例如HTML報表、PDF報表等)的接口。因此,我們將擁有一組不同的接口來處理不同類型的數據庫。現在,客戶端應用程序可以使用這些接口來獲取所需的數據庫連接並生成報表。但是,當複雜性增加或接口行為名稱混淆時,客戶端應用程序將發現很難管理。因此,在現有接口之上應用外觀設計模式,並提供一個封裝接口,以幫助客戶端應用程序。

外觀設計模式- 一組接口

我們可以有兩個輔助接口,即MySqlHelperOracleHelper

package com.journaldev.design.facade;

import java.sql.Connection;

public class MySqlHelper {
	
	public static Connection getMySqlDBConnection(){
		//使用連接參數獲取MySql數據庫連接
		return null;
	}
	
	public void generateMySqlPDFReport(String tableName, Connection con){
		//從表中獲取數據並生成PDF報表
	}
	
	public void generateMySqlHTMLReport(String tableName, Connection con){
		//從表中獲取數據並生成PDF報表
	}
}
package com.journaldev.design.facade;

import java.sql.Connection;

public class OracleHelper {

	public static Connection getOracleDBConnection(){
		//使用連接參數獲取Oracle數據庫連接
		return null;
	}
	
	public void generateOraclePDFReport(String tableName, Connection con){
		//從表中獲取數據並生成PDF報表
	}
	
	public void generateOracleHTMLReport(String tableName, Connection con){
		//從表中獲取數據並生成PDF報表
	}
	
}

外觀設計模式介面

我們可以創建如下的外觀模式介面。請注意使用Java Enum來保證類型安全。

package com.journaldev.design.facade;

import java.sql.Connection;

public class HelperFacade {

	public static void generateReport(DBTypes dbType, ReportTypes reportType, String tableName){
		Connection con = null;
		switch (dbType){
		case MYSQL: 
			con = MySqlHelper.getMySqlDBConnection();
			MySqlHelper mySqlHelper = new MySqlHelper();
			switch(reportType){
			case HTML:
				mySqlHelper.generateMySqlHTMLReport(tableName, con);
				break;
			case PDF:
				mySqlHelper.generateMySqlPDFReport(tableName, con);
				break;
			}
			break;
		case ORACLE: 
			con = OracleHelper.getOracleDBConnection();
			OracleHelper oracleHelper = new OracleHelper();
			switch(reportType){
			case HTML:
				oracleHelper.generateOracleHTMLReport(tableName, con);
				break;
			case PDF:
				oracleHelper.generateOraclePDFReport(tableName, con);
				break;
			}
			break;
		}
		
	}
	
	public static enum DBTypes{
		MYSQL,ORACLE;
	}
	
	public static enum ReportTypes{
		HTML,PDF;
	}
}

外觀設計模式客戶端程式

現在讓我們看看在不使用外觀模式和使用外觀模式介面的客戶端代碼。

package com.journaldev.design.test;

import java.sql.Connection;

import com.journaldev.design.facade.HelperFacade;
import com.journaldev.design.facade.MySqlHelper;
import com.journaldev.design.facade.OracleHelper;

public class FacadePatternTest {

	public static void main(String[] args) {
		String tableName="Employee";
		
		// 在不使用外觀的情況下生成 MySql HTML 報告和 Oracle PDF 報告
		Connection con = MySqlHelper.getMySqlDBConnection();
		MySqlHelper mySqlHelper = new MySqlHelper();
		mySqlHelper.generateMySqlHTMLReport(tableName, con);
		
		Connection con1 = OracleHelper.getOracleDBConnection();
		OracleHelper oracleHelper = new OracleHelper();
		oracleHelper.generateOraclePDFReport(tableName, con1);
		
		// 使用外觀生成 MySql HTML 報告和 Oracle PDF 報告
		HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
		HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
	}

}

您可以看到,使用外觀模式介面是避免在客戶端有大量邏輯的更簡單、更清潔的方法。JDBC 驅動程序管理器類用於獲取數據庫連接是外觀設計模式的一個很好的示例。

外觀設計模式的重要要點

  • 外觀設計模式更像是客戶應用程式的助手,它並不隱藏子系統介面。是否使用外觀設計模式完全取決於客戶端代碼。
  • 外觀設計模式可以應用在開發的任何階段,通常是當界面數量增加並且系統變得複雜時。
  • 子系統介面不知道外觀,並且不應該有任何外觀介面的引用。
  • 外觀設計模式應該應用於類似的介面,其目的是提供單一介面,而不是多個類似工作的介面。
  • 我們可以與外觀一起使用工廠模式,為客戶系統提供更好的介面。

這就是外觀設計模式的全部內容,敬請期待更多設計模式文章。 🙂

Source:
https://www.digitalocean.com/community/tutorials/facade-design-pattern-in-java