#软件构造实验 Façade设计模式(外观模式)

Façade设计模式

Façade设计模式是结构设计模式下的一种
当我么面临客户端需要通过一个简化的接口来访问复杂系统内的功能 的问题的时候。
利用Façade设计模式提供一个统一的接口来取代一系列小接口调用,相当于对复杂系统做了一个封装,简化客户端使用 ,同时可以便于客户端学习使用,解耦

Façade设计模式适用于类相同种类的接口,其目的是提供一个单一的接口,取代提供多个执行相同种类工作的接口的方式。
Façade设计模式
下面给一个例子

  • 假设我们有一个带有一些使用MySql / Oracle数据库接口来生成不同类型的文档(例如HTML,PDF)的应用程序。
  • 我们需要设计不同的接口集来适配不同类型的数据库来让客户端应用程序可以使用这些接口来获取所需的数据库连接,并生成报告。
  • 但是,当问题的复杂性增加或根据接口的行为进行命名可能会导致混淆的时候,客户端应用程序将发现很难对这些接口进行有效的管理和调用。
  • 因此,我们可以在此处应用Facade模式,并在现有接口之上提供包装器接口,以帮助客户端应用程序。

下面我们看一下这一情境的实例代码,这两个类分别封装了客户端所需的功能,依托两个数据库分别生成PDF文档和HTML格式文档等


public class MySqlHelper {
	public static Connection getMySqlDBConnection() {} 
	public void generateMySqlPDFReport (String tableName, Connection con){} 
	public void generateMySqlHTMLReport (String tableName, Connection con){}
}

public class OracleHelper {
	public static Connection getOracleDBConnection() {} 
	public void generateOraclePDFReport (String tableName, Connection con){} 
	public void generateOracleHTMLReport (String tableName, Connection con){}
}

如果我们用Façade设计模式来对其进行重构

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:} 
	 public static enum DBTypes      { MYSQL,ORACLE; } 
	 public static enum ReportTypes  { HTML,PDF;}
 }

在客户端里,我们来比较一些用Façade设计模式重构前后的不同

String tableName="Employee";
Connection con = MySqlHelper.getMySqlDBConnection(); 
MySqlHelper mySqlHelper = new MySqlHelper(); 
mySqlHelper.generateMySqlHTMLReport(tableName, con);
Connection con1 = OracleHelper.getOracleDBConnection();
 OracleHelper oracleHelper = new OracleHelper(); 
 oracleHelper.generateOraclePDFReport(tableName, con);

应用Façade设计模式前

HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName); 
HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);

应用Façade设计模式后

可以看到应用Façade设计模式后,我们的客户端不需要创建多个实例,只需调用一个静态方法并传入合适的参数即可实现原来需要好多行的代码
这里就体现了其优点:应用Façade设计模式可以大规模简化客户端的使用难度,有助于我们设计出高效简洁易用的API

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值