Java外观设计模式详解:原理、应用场景与实例教程

这是文章《Java中的外观设计模式》的第1部分(共1部分)。

外观设计模式是结构型设计模式之一(如适配器模式和装饰者模式)。外观设计模式用于帮助客户端应用与系统轻松交互。

外观设计模式

根据GoF的定义,外观设计模式是:

在子系统中提供一组接口的统一界面。外观模式定义了一个更高级别的接口,使子系统更容易使用。

假设我们有一个应用程序,具有一组与MySQL/Oracle数据库交互并生成不同类型报告(如HTML报告、PDF报告等)的接口。因此,我们将有一组不同的接口用于处理不同类型的数据库。现在,客户端应用程序可以使用这些接口来获取所需的数据库连接并生成报告。但是,当复杂性增加或接口行为名称不清时,客户端应用程序会发现很难管理。因此,在这里我们可以应用外观设计模式,并在现有接口之上提供一个包装接口来帮助客户端应用程序。

外观设计模式 – 接口集合

我们可以有两个帮助接口,分别为MySqlHelper和OracleHelper。

package com.Olivia.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){
		//从表中获取数据并生成HTML报告
	}
}
package com.Olivia.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){
		//从表中获取数据并生成HTML报告
	}
	
}

外观设计模式接口

我们可以创建一个如下所示的Facade模式接口。请注意使用Java枚举来确保类型的安全性。

package com.Olivia.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.Olivia.design.test;

import java.sql.Connection;

import com.Olivia.design.facade.HelperFacade;
import com.Olivia.design.facade.MySqlHelper;
import com.Olivia.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驱动程序管理类来获取数据库连接是外观设计模式的一个很好的例子。

外观设计模式的重要要点

  • 外观设计模式更像是客户端应用程序的助手,它不会向客户端隐藏子系统接口。是否使用外观模式完全取决于客户端代码。
  • 外观设计模式可以在开发的任何阶段应用,通常当接口数量增加且系统变得复杂时使用。
  • 子系统接口不知道外观的存在,它们不应该有任何对外观接口的引用。
  • 外观设计模式应该应用于类似类型的接口,其目的是提供单一接口而不是多个执行类似工作的接口。
  • 我们可以将工厂模式与外观模式结合使用,为客户端系统提供更好的接口。

关于外观设计模式的内容就到这里了,请继续关注更多设计模式文章吧!:)

bannerAds