外观设计模式 是** 结构化设计模式** 中的一种(如Adapter pattern和Decorator pattern)。Facade设计模式用于帮助客户端应用程序轻松地与系统交互。
门面设计模式
中的立面设计模式、立面模式、立面设计模式根据GoF立面设计模式是:
为子系统中的一组接口提供统一的接口。外观模式定义了一个更高级别的接口,使子系统更易于使用。
假设我们有一个应用程序,它有一组接口来使用MySQL/Oracle数据库并生成不同类型的报告,如HTML报告、PDF报告等。因此,我们将有不同的接口集来处理不同类型的数据库。现在,客户端应用程序可以使用这些接口来获取所需的数据库连接并生成报告。但当复杂性增加或接口行为名称混淆时,客户端应用程序会发现很难对其进行管理。因此,我们可以在这里应用外观设计模式,并在现有接口上提供wrapper接口来帮助客户端应用程序。
外观设计模式-界面集
我们可以有两个helper接口,即MySqlHelper
和OracleHelper
。
1package com.journaldev.design.facade;
2
3import java.sql.Connection;
4
5public class MySqlHelper {
6
7 public static Connection getMySqlDBConnection(){
8 //get MySql DB connection using connection parameters
9 return null;
10 }
11
12 public void generateMySqlPDFReport(String tableName, Connection con){
13 //get data from table and generate pdf report
14 }
15
16 public void generateMySqlHTMLReport(String tableName, Connection con){
17 //get data from table and generate pdf report
18 }
19}
1package com.journaldev.design.facade;
2
3import java.sql.Connection;
4
5public class OracleHelper {
6
7 public static Connection getOracleDBConnection(){
8 //get Oracle DB connection using connection parameters
9 return null;
10 }
11
12 public void generateOraclePDFReport(String tableName, Connection con){
13 //get data from table and generate pdf report
14 }
15
16 public void generateOracleHTMLReport(String tableName, Connection con){
17 //get data from table and generate pdf report
18 }
19
20}
外观设计模式接口
我们可以创建一个外观模式界面,如下所示。注意使用Java Enum来保证类型安全。
1package com.journaldev.design.facade;
2
3import java.sql.Connection;
4
5public class HelperFacade {
6
7 public static void generateReport(DBTypes dbType, ReportTypes reportType, String tableName){
8 Connection con = null;
9 switch (dbType){
10 case MYSQL:
11 con = MySqlHelper.getMySqlDBConnection();
12 MySqlHelper mySqlHelper = new MySqlHelper();
13 switch(reportType){
14 case HTML:
15 mySqlHelper.generateMySqlHTMLReport(tableName, con);
16 break;
17 case PDF:
18 mySqlHelper.generateMySqlPDFReport(tableName, con);
19 break;
20 }
21 break;
22 case ORACLE:
23 con = OracleHelper.getOracleDBConnection();
24 OracleHelper oracleHelper = new OracleHelper();
25 switch(reportType){
26 case HTML:
27 oracleHelper.generateOracleHTMLReport(tableName, con);
28 break;
29 case PDF:
30 oracleHelper.generateOraclePDFReport(tableName, con);
31 break;
32 }
33 break;
34 }
35
36 }
37
38 public static enum DBTypes{
39 MYSQL,ORACLE;
40 }
41
42 public static enum ReportTypes{
43 HTML,PDF;
44 }
45}
门面设计模式客户端程序
现在,让我们看看不使用门面模式和使用门面模式接口的客户端代码。
1package com.journaldev.design.test;
2
3import java.sql.Connection;
4
5import com.journaldev.design.facade.HelperFacade;
6import com.journaldev.design.facade.MySqlHelper;
7import com.journaldev.design.facade.OracleHelper;
8
9public class FacadePatternTest {
10
11 public static void main(String[] args) {
12 String tableName="Employee";
13
14 //generating MySql HTML report and Oracle PDF report without using Facade
15 Connection con = MySqlHelper.getMySqlDBConnection();
16 MySqlHelper mySqlHelper = new MySqlHelper();
17 mySqlHelper.generateMySqlHTMLReport(tableName, con);
18
19 Connection con1 = OracleHelper.getOracleDBConnection();
20 OracleHelper oracleHelper = new OracleHelper();
21 oracleHelper.generateOraclePDFReport(tableName, con1);
22
23 //generating MySql HTML report and Oracle PDF report using Facade
24 HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
25 HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
26 }
27
28}
正如您所看到的,使用外观模式接口是一种更简单、更简洁的方式,可以避免在客户端有很多逻辑。获得数据库连接的JDBC驱动程序管理器类是外观设计模式的一个很好的例子。
外观设计模式要点
- 外观设计模式更像是客户端应用程序的帮助器,它不会对客户端隐藏子系统接口。是否使用Facade完全取决于客户端代码。
- 外观设计模式可以应用于任何开发阶段,通常是在接口数量增加和系统变得复杂的时候。
- 子系统接口不知道Facade,它们不应该有任何对Facade接口的引用。
- 外观设计模式应该应用于类似类型的接口,其目的是提供单个接口,而不是多个接口来完成类似类型的工作。
- 我们可以将工厂pattern与Facade结合使用,为客户端系统提供更好的接口。
以上是门面设计模式的全部内容,敬请关注更多设计模式文章。:)