设计模式之旅-第二天 外观模式

一. 现实问题

在.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;
}
}

五. 模式总结

在使用外观模式隐藏细节的同时,可以更合细的划分这些细节,把他们放置到不同的类或方法中,以 提供不同的外观,使客户端调用更方便。

时间: 2024-09-11 18:43:24

设计模式之旅-第二天 外观模式的相关文章

设计模式的C++实现之外观模式

概述 想想我们小时候玩的四驱车,里面的构造很复杂,马达,舵机,电池组等等,而我们控制它却非常简单,只 要打开电池开关,他就可以跑.我们其实不用知道它里面是如何工作,只要知道拨动开关它就可以工作就行了,这个开关其 实就四驱车给我们的一个友好的组件,使得我们可以很方便的控制它. 外观模式其实定义了一个高层接口,该接口 为子系统中的一组接口提供一个一致的界面,使得这一子系统更加容易使用. 类图和样例 在这个对象图中,出现了两个 角色: 外观(Facade)角色:客户端可以调用这个角色的方法.此角色知晓

设计模式学习笔记(一) Facade外观模式

GOF<设计模式>一书对Facade模式是这样描述的: 为子系统中的一组接口提供一个统一接口.Facade模式定义了一个更高层的接口,使子系统更加容易使用. 大致意思是说:使用一种比原有方式更简单的办法与系统交互.例如,我们把一个很文件的文件,放在了第二抽屉里,而第二个抽屉的钥匙放在了第一个抽屉里,我们要想取出这个文件,第一步肯定要拿到第一个抽屉的钥匙,然后打开它再拿出第二个抽屉的钥匙,最后打开第二个抽屉取出文件. 我就上面说的那个情形写一下实现代码,首先我们要实现二个子系统,呵呵,把抽屉比喻

.NET设计模式(12):外观模式

概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是要说的Faç ;ade 模式. 意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.[GOF <设计模式>] 示意图 门面模式没有一个一般化的类图描述,下面是一个示意性的对象图: 图1 Faç ;ade模式示意性对象图

.NET设计模式-外观模式(Façade Pattern)

外观模式(Façade Pattern) --.NET设计模式系列之十二 Terrylee,2006年3月 概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是要说的Façade 模式. 意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.[GOF <设计模式>] 示意

设计模式之旅-第一天 适配器模式

什么是设计模式 在软件开发的世界里,许多领域中的问题具有相似的特性.就像造房子一样,不管要盖一座购物中心 ,还是要盖一座假日酒店,它们之间都有基本上相似的工作步骤,都需要搭建梁柱,铺置房顶等工作. 在做这些工作时都需要遵循某种特殊的技术要求,以使得房子的结构.承受能力达到合理,这些规则是 前人经过精确的计算和失败的教训得来的.对于软件开发也一样,如果我们希望编写出来健壮.灵活的 应用程序,也有必要进行精细的设计,并且可以通过遵循某种规则以达到这个目标.这些规则或者称之 为技巧就是设计模式. 设计

【机房合作】重新认识外观模式

机房收费系统合作版,是我们第三次与机房收费系统相遇的时刻.在个人重构的时候,我们就开始了"七层架构"之旅,其中外观模式是单独作为一层来开发的. 那个时候,也不理解外观是起到怎样一个作用,大话上的解释表面上容易理解,看完后自己也觉得很有道理.但在系统程序中,自己是只要经过BLL逻辑层的一个方法,就需要再经过一次外观,从而"解除耦合",避免了UI层与BLL层之间直接传递数据. 那个时候,在敲代码的时候就有一种感觉:每次写完B层逻辑,又要在F层重新写一次,这就是在解耦和吗

Java设计模式详解之门面模式(外观模式)_java

门面模式(Facade Pattern)也叫外观模式,它隐藏系统的复杂性,并向客户端提供一个可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性,为子系统中的一组接口提供了一个统一的高层访问接口,这个接口使得子系统更容易被访问或使用.这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用. 简而言之,就是把一堆复杂的流程封装成一个接口供给用户更简单的使用,这个设计模式里有三个角色: 1)门面角色( facade ):

Ruby设计模式编程中对外观模式的应用实例分析_ruby专题

何为外观模式?     外观模式为子系统中一组不同的接口提供统一的接口.外观定义了上层接口,通过降低复杂度和隐藏子系统间的通信以及依存关系,让子系统更加易于使用.     比方说子系统中有一组不同的类,其中一些彼此依赖.这让客户端难以使用子系统中的类,因为客户端需要知道每一个类.外观起到整个子系统的入口.有些客户端只需要子系统的某些基本行为,而对子系统的类不做太多定制,外观为这样的客户端提供简化的接口.只有需要从某些子系统的类定制更多行为的客户端,才会关注外观背后的细节.     外观模式:为系

PHP设计模式之外观模式

外观设计模式的目标是: 控制外部错综复杂的关系, 并且提供简单的接口以利用上述组件的能力. 为了隐藏复杂的,执行业务进程某个步骤所需的方法和逻辑组,就应当使用基于外观设计模式的类. <?php        /**        * 代码示例: 获取CD对象,对其所有属性应用大写形式,并且创建一个要提交给Web服务的,格式完整的XML文档.        */        class CD {                        public $tracks = array();