C#设计模式学习3——外观模式
外观模式主要应用在为类的集合提供一个简单的接口。比如在实际编程中,我常用到的数据库访问层封装的数据访问类,以及在这个类上封装的针对具体功能的更细致的子类。
基础类的集合一般提供了很多扩展性非常强,功能非常大,涵盖范围相当大的功能,例如ADO.NET中的基础类。这些类通过不同的组合方法能实现相当强大的功能。但是应用到具体的项目中时,实际用不到那么多的功能,而且多次运用的时候,经常会产生重复代码。因此,我们把一些常用的语句封装起来,避免重复代码的书写。同时,可以把一些针对项目的具体逻辑再封装在一起,对外提供接口。那么在实际应用中,我们在调用的时候,只要满足接口定义的要求,便能实现这项具体的逻辑应用。从而避免了重复书写内部实现逻辑的代码,也不必理会内部逻辑的具体实现。这就是外观模式。
外观模式多出现在一般的应用程序开发中。如果系统开发采用分层结构的话,最常用到外观模式的就是表现层的开发。外观模式主要是为子系统提供一个简化的访问基础类的手段。
例如,ADO.NET的封装中,首先我们将建立连接,打开连接,执行语句,关闭连接等相关数据库操作封装在一起,形成一个数据库访问类。那么每次进行数据操作时,我们只需调用这个类对外开放的方法即可进行数据库操作,而不必每次都实现以上的操作。
其次,我们在实现具体的逻辑关系时,也就是sql语句的拼凑,我们可以另外在封装在一个方法中,此方法在执行sql语句的时候,调用数据库访问类的方法。此时对外提供的就是这个逻辑的实现接口,我们只需在调用此接口中满足接口的定义,即可实现此逻辑。
当然,复杂的逻辑中,可能执行多个sql语句,我们只需将这些逻辑封装在一起,就可以实现复杂的逻辑过程。
一个简单的例子
{
public ShowRocketsFormTable()
{
DataGrid g = UI.NORMAL.CreateGrid();
g.DataSource = DataServices.CreateTable("select * from Rocket");
Controls.Add(g);
}
public static void Main()
{
Application.run(new ShowRocketsFormTable());
}
}
此例是窗体程序的一部分。其中,UI.NORMAL.CreateGrid()是个定义好的类其中的一个方法,它提供了一个对DataGrid控件的定义;而DataServices.CreateTable("select * from Rocket")也是定义好的类其中的一个方法,它提供了通过传入一个sql语句,然后对数据库进行访问,最后返回结果表。这些定义好的类就是应用了外观模式的类。它内部的具体实现过程,对于调用它的方法是透明的。它只是对外开放一个外观接口,让满足此接口的外部程序进行调用。
外观模式其实就是一个丰富的工具类和一个具体特定母的的应用程序的一个折衷。
Difficulty of making decision depends on what to lose not gain