Java中的外观设计模式

时间:2020-02-23 14:36:13  来源:igfitidea点击:

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

Facade设计模式

根据GoF Facade的设计模式是:

<p>Provide a unified interface to a set of interfaces in a subsystem. Facade Pattern defines a higher-level interface that makes the subsystem easier to use.</p>

假设我们有一个带有一组接口的应用程序,以使用MySql/Oracle数据库并生成不同类型的报告,例如HTML报告,PDF报告等。

因此,我们将使用不同的接口集来处理不同类型的数据库。
现在,客户端应用程序可以使用这些接口来获取所需的数据库连接并生成报告。

但是,当复杂性增加或者接口行为名称令人困惑时,客户端应用程序将发现很难对其进行管理。

因此,我们可以在此处应用Facade设计模式,并在现有接口之上提供包装器接口,以帮助客户端应用程序。

Facade设计模式–接口集

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

package com.theitroad.design.facade;

import java.sql.Connection;

public class MySqlHelper {
	
	public static Connection getMySqlDBConnection(){
		//get MySql DB connection using connection parameters
		return null;
	}
	
	public void generateMySqlPDFReport(String tableName, Connection con){
		//get data from table and generate pdf report
	}
	
	public void generateMySqlHTMLReport(String tableName, Connection con){
		//get data from table and generate pdf report
	}
}
package com.theitroad.design.facade;

import java.sql.Connection;

public class OracleHelper {

	public static Connection getOracleDBConnection(){
		//get Oracle DB connection using connection parameters
		return null;
	}
	
	public void generateOraclePDFReport(String tableName, Connection con){
		//get data from table and generate pdf report
	}
	
	public void generateOracleHTMLReport(String tableName, Connection con){
		//get data from table and generate pdf report
	}
	
}

Facade设计模式接口

我们可以创建一个Facade模式接口,如下所示。
注意将Java Enum用于类型安全。

package com.theitroad.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;
	}
}

Facade设计模式客户程序

现在让我们在不使用Facade模式和Facade模式界面的情况下查看客户端代码。

package com.theitroad.design.test;

import java.sql.Connection;

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

public class FacadePatternTest {

	public static void main(String[] args) {
		String tableName="Employee";
		
		//generating MySql HTML report and Oracle PDF report without using Facade
		Connection con = MySqlHelper.getMySqlDBConnection();
		MySqlHelper mySqlHelper = new MySqlHelper();
		mySqlHelper.generateMySqlHTMLReport(tableName, con);
		
		Connection con1 = OracleHelper.getOracleDBConnection();
		OracleHelper oracleHelper = new OracleHelper();
		oracleHelper.generateOraclePDFReport(tableName, con1);
		
		//generating MySql HTML report and Oracle PDF report using Facade
		HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
		HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
	}

}

正如您所看到的那样,使用Facade模式界面是一种避免客户端逻辑过多的简便方法。
获得数据库连接的JDBC Driver Manager类是外观设计模式的一个很好的例子。

立面设计模式要点

  • 外观设计模式更像是客户端应用程序的助手,它不会向客户端隐藏子系统接口。
    是否使用Facade完全取决于客户端代码。

  • 外观设计模式可以应用于任何开发点,通常是在接口数量增加和系统变得复杂时使用。

  • 子系统接口不了解Facade,因此不应具有Facade接口的任何引用。

  • 外立面设计模式应应用于相似类型的接口,其目的是提供一个单一的接口,而不是提供多个执行相似类型工作的接口。

  • 我们可以将Factory模式与Facade结合使用,以提供与客户端系统更好的接口。