1. 程式人生 > >設計模式第9篇:外觀設計模式

設計模式第9篇:外觀設計模式

一.外觀設計模式所解決的問題

外觀設計模式為子系統中的一組介面提供統一的介面,這種統一的介面遮蔽了直接呼叫子系統時的邏輯關係,使得呼叫子系統時更容易。

二.外觀設計模式用例

假如一個應用中有兩個介面MysqlHelper.class和OracleHelper.class,兩個介面功能分別是連線mysql和oracle資料庫,然後生成HTML報表或者PDF報表,程式碼說明如下:

MysqlHelper.class和OracleHelper.class

import java.sql.Connection;

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 } } 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 } }

外觀類HelperFacade.class

import java.sql.Connection
class
HelperFacade{ public static void generateReport(DatabaseType dbType,ReportType 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=MySqlHelper.getMySqlDBConnection(); OracleHelper oracleHelper=new OracleHelper(); switch (reportType){ case HTML: oracleHelper.generateOracleHTMLReport(tableName,con); break; case PDF: oracleHelper.generateOraclePDFReport(tableName,con); break; } } } public static enum DatabaseType{ MYSQL,ORACLE } public static enum ReportType{ HTML,PDF } }

直接呼叫子介面和呼叫統一介面(外觀類)對比:

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);
    }

}

三.外觀設計模式使用場景

1.外觀設計模式可以運用在任何開發階段,通常用在介面數量越來越多、系統變得複雜的時候。

2.子介面不應該有外觀類的引用。

3.子介面提供的功能應該相似,因為外觀介面就是通過包裝子介面來提供一個介面來做一些相似的功能。