一. 现实问题
在.NET中使用ADO.NET来访问数据库。在读取数据时需要使用不同的数据提供程序的连接对象、命令 对象、适配器对象、数据容器对象,客户端显示数据时如果需要频繁的与这些对象进行交互无疑增加了 系统的复杂性,而且也不利于维护,试想如果需要从SQL Server数据库切换至Oracle,则需要修改每一 处数据读取的代码。
二. 解决方案
为数据读取操作创建一个“外观”,该外观隐藏了底层数据访问的细节,客户端通过该外 观读取需要的数据。
与之相似的一个问题是Web页面上经常需要进行的数据验证,在提交表单时需要判断数据是否合法, 如果不合法则改变相应表单元素的外观,在执行这些操作时可能会用到一些正则表达式对象或其他对象 ,如果按照正常的方式来编写则同样增加了客户端的复杂性。此时也可以使用外观模式。
三. 模式定义
外观模式(Façade)的目的是提供一个接口,通过这个接口,可以使一个子系统更容易使用 。
四. 示例代码
实现一个显示所有用户姓名和产品编号的应用程序,在没有使用外观模式以前,类关系图如下所示:
为数据访问引入外观后,类关系图如下:
DatabaseFacade类代码如下所示:
class DatabaseFacade
{
public DataTable GetData(string sql)
{
using (SqlConnection conn = new SqlConnection(string.Empty))
{
DataTable table = new DataTable();
SqlDataAdapter ad = new SqlDataAdapter(string.Empty,conn);
ad.Fill(table);
return table;
}
}
}
客户端访问数据时通过外观即可:
class Client
{
public DataTable GetUserNames()
{
DatabaseFacade fac = new DatabaseFacade();
string sql = string.Empty;
DataTable table = fac.GetData(sql);
return table;
}
public DataTable GetProductIds()
{
DatabaseFacade fac = new DatabaseFacade();
string sql = string.Empty;
DataTable table = fac.GetData(sql);
return table;
}
}
五. 模式总结
在使用外观模式隐藏细节的同时,可以更合细的划分这些细节,把他们放置到不同的类或方法中,以 提供不同的外观,使客户端调用更方便。