Java中的外观设计模式
外观设计模式是结构型设计模式之一(如适配器模式和装饰者模式)。外观设计模式用于帮助客户应用与系统轻松交互。
外观设计模式
根据GoF的定义,外观设计模式是:
在子系统中提供一组接口的统一界面。 外观模式定义了一个更高级别的接口,使子系统更容易使用。
假设我们有一个应用程序,具有一组与MySql / Oracle数据库交互并生成不同类型报告(如HTML报告、PDF报告等)的接口。因此,我们将有一组不同的接口用于处理不同类型的数据库。现在,客户端应用程序可以使用这些接口来获取所需的数据库连接并生成报告。但是,当复杂性增加或界面行为名称不清时,客户端应用程序会发现很难管理。因此,在这里我们可以应用外观设计模式,并在现有接口之上提供一个包装接口来帮助客户端应用程序。
外观设计模式 – 接口集合
我们可以有两个帮助接口,分别为MySqlHelper和OracleHelper。
package com.Olivia.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.Olivia.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
}
}
外观设计模式接口 shè jì jiē
我们可以创建一个如下所示的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";
//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);
}
}
正如你所看到的,使用外观模式接口是避免在客户端上拥有大量逻辑的一种更容易、更清晰的方式。使用JDBC驱动程序管理类来获取数据库连接是外观设计模式的一个很好的例子。
外观设计模式的重要要点
- Facade design pattern is more like a helper for client applications, it doesn’t hide subsystem interfaces from the client. Whether to use Facade or not is completely dependent on client code.
- Facade design pattern can be applied at any point of development, usually when the number of interfaces grow and system gets complex.
- Subsystem interfaces are not aware of Facade and they shouldn’t have any reference of the Facade interface.
- Facade design pattern should be applied for similar kind of interfaces, its purpose is to provide a single interface rather than multiple interfaces that does the similar kind of jobs.
- We can use Factory pattern with Facade to provide better interface to client systems.
关于外观设计模式的内容就到这里了,请继续关注更多设计模式文章吧!:)