结构设计模式 - 门面设计模式
Facade Design Pattern是结构设计模式之一(例如Adapter模式和Decorator模式)。Facade设计模式用于帮助客户端应用程序轻松地与系统交互。门面设计模式,即外观设计模式

目录[ 隐藏 ]
门面设计模式
根据GoF Facade的设计模式是:
为子系统中的一组接口提供统一接口。Facade Pattern定义了一个更高级别的接口,使子系统更易于使用。
假设我们有一组带有接口的应用程序来使用MySql / Oracle数据库并生成不同类型的报告,例如HTML报告,PDF报告等。
因此,我们将使用不同的接口集来处理不同类型的数据库。现在,客户端应用程序可以使用这些接口来获取所需的数据库连接并生成报告。
但是当复杂性增加或界面行为名称令人困惑时,客户端应用程序将难以管理它。
因此,我们可以在此处应用Facade设计模式,并在现有界面之上提供包装器界面以帮助客户端应用程序。

门面设计模式 - 接口集
我们可以有两个辅助接口,即MySqlHelper和OracleHelper。
package com.journaldev.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.journaldev.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模式界面。请注意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;
}
}
门面设计模式客户端程序
现在让我们看看客户端代码,而不使用Facade模式和使用Facade模式接口。
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";
//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设计模式可以应用于任何开发点,通常是当接口数量增加和系统变得复杂时。
- 子系统接口不知道Facade,它们不应该有Facade接口的任何引用。
- Facade设计模式应该应用于类似的接口,其目的是提供单个接口而不是多个接口来完成类似的工作。
- 我们可以将工厂模式与Facade结合使用,为客户端系统提供更好的接口。
多数为Facade设计模式,敬请期待更多设计模式文章。 
转载来源:https://www.journaldev.com/1557/facade-design-pattern-in-java


1158

被折叠的 条评论
为什么被折叠?



