1.概述1.1意图 外观模式定义了一个将子系统的一组接口集成在一起的高层接口,以提供一个一致的界面。通过这个界面,其他系统可以方便地调用子系统中的功能,而忽略子系统内部发生的变化。1.2使用场合 在如下情况下可以使用外观模式。(1)为一个比较复杂的子系统提供一个简单的接口。(2)将客户程序与子系统的实现部分分离,提高子系统的独立性和可移植性。(3)简化子系统间的依赖关系。1.3 结构 下图所示为外观模式的结构。由于该模式的引入,所以外界访问通过这个统一接口进行,系统的复杂性得到降

上天保佑收录:

http://gnhao.blog.163.com/blog/static/719145320135139746163/
http://blog.sina.com.cn/s/blog_5676ce6b0101ef69.html
http://blog.tianya.cn/blogger/post_read.asp?BlogID=4545397&PostID=51297129

低。 在实际中,我们不仅可以从软件逻辑上划分出子系统或者独立的功能模块,并且可以通过将它们封装为某一类型的组件,使其在物理上获得独立。不仅可以单独使用,还有利于系统的升级。 在Windows系统下,可以将一个软件划分后的部分封装为动态接库。然后由主程序调用这些动态接库,封装在动态库中的类(或功能模块)通过外观模式接口与外界发生联系。 1.4效果 外观模式为用户提供了使用子系统组件的简化的接口,使用户减少了处理对象的数目,并且使子系统使用简单。 使用外观模式使子系统和客户之间实现松耦合关系,由于客户针对其接口编程,因此子系统的变化不会影响客户的变化,即其有助于分层体系结构的实现。外观模式并没有限制客户使用子系统类,仍可以直接使用子系统中的类。2.数据库访问外观模式 在前面已经介绍了有关数据库访问的内容,只是角度不同,其中的部分代码如下。 1PublicMustInheritClassclsAbstractDBClassclsAbstractDB2ProtectedmConnStringAsString3PublicPropertyConnString()PropertyConnString()AsString4Get5ReturnmConnString6EndGet7Set(ByValValueAsString)8mConnString=Value9EndSet10EndProperty1112PublicSubNew()SubNew(ByValcsAsString)13mConnString=cs14EndSub1516PublicMustOverrideSubOpen()SubOpen()17PublicMustOverrideSubclose()Subclose()18PublicMustOverrideFunctionExecSQL()FunctionExecSQL(ByValstrSQLAsString)AsDataTable19PublicMustOverrideSubExecSQLNonQuery()SubExecSQLNonQuery(ByValstrSQLAsString)20PublicMustOverrideFunctionTrateDateField()FunctionTrateDateField(ByValstrDateValueAsString)AsString21EndClass22

ClsAbstractDB定义了外观模式的接口,在针对具体数据库中实现了对Connection、Command和DataAdpter的封装。以ClsAbstractDB为例,代码如下: 1PublicClassclsSQLServerDBClassclsSQLServerDB2InheritsclsAbstractDB3PrivatemConnAsData.SqlClient.SqlConnection4PublicSubNew()SubNew(ByValcsAsString)5MyBase.New(cs)6mConn=NewData.SqlClient.SqlConnection7EndSub8PublicOverridesSubclose()Subclose()9IfmConn.StateConnectionState.ClosedThen10mConn.Close()11EndIf12EndSub1314PublicOverridesFunctionExecSQL()FunctionExecSQL(ByValstrSQLAsString)AsSystem.Data.DataTable15DimdtAsDataTable16DimdbCommAsNewData.SqlClient.SqlCommand(strSQL)17DimdbAptAsNewData.SqlClient.SqlDataAdapter(dbComm)18dbComm.Connection=mConn19dbApt.Fill(dt)20Returndt21EndFunction2223PublicOverridesSubExecSQLNonQuery()SubExecSQLNonQuery(ByValstrSQLAsString)24DimdbCommAsNewData.SqlClient.SqlCommand(strSQL)25dbComm.Connection=mConn26dbComm.ExecuteNonQuery()27EndSub2829PublicOverridesSubOpen()SubOpen()30IfmConn.State=ConnectionState.ClosedThen31mConn.ConnectionString=mConnString32mConn.Open()33EndIf34EndSub3536PublicOverridesFunctionTrateDateField()FunctionTrateDateField(ByValstrDateValueAsString)AsString37Return"#"strDateValue"#"38EndFunction3940ProtectedOverridesSubFinalize()SubFinalize()41MyBase.Finalize()42mConn=Nothing43EndSub44EndClass45

这样,当客户端软件需要执行SQL语句时,只要调用ExecSQL方法即可。3.分层结构与外观模式 分层体系结构是一个时髦的话题,理论上讲,分层结构可以使系统更为清晰,更具可维护性。然而,在实践中,如果层次划分不合理,就会产生数据和功能的冗余。 需要注意的是分层的原则,即业务类负责的是业务处理,还是数据缓存。必须说明的是,层次的划分按照功能进行,而数据是在层次之间的传递。 在实现分层设计时,我们不希望层次之间有跨越;否则分层实际上没有太多意义。然而,层次之间的界面经常很难划分清楚,可以采用外观模式封装层次。在设计时可以规定,对英雄模范一层次的访问必须经过外观对象。即确保外观是层次对外的惟一接口,编程从员面对的只是其他层次的外观。这样,就保证了层次仅与相临的部分交互。4.封装子系统 系统升级时,经常是一个大系统的若干子系统分别升级。这时需要封装遗留的子系统,以对外提供一个简单的接口。这种封装可以减少子系统的变化对与它接口的系统的影响,只要接口不发生变化,子系统即可作为孤立的模块升级。 在系统升级过程中,我们不主张将所有的代码升级为新的版本,如从VB 6升级到VB.NET。因为升级过程会遇到各种不确定性,这种不确定性增加了系统实施的风险,在升级体系结构,要达到这个目的,首先要封装子系统。如升级VB 6,可以将可隔离的代码封装为DLL,以被VB.NET引用。完成体系结构升级后,再逐一更新。为了降低新系统和遗留系统的耦合性,可以采用外观模式,封装接口部分的功能,仅能够通过这个接口访问遗留系统。这时,外观模式的实现可以用下图表示。 可以看出,这种结构与适配器模式有些类似,并且目的也一致,不同的是这里针对的目标系统粒度要大得多。 5.子系统隔离 升级与整合一个包含多个子系统的信息系统时,需要隔离这些子系统,以降低耦合性。隔离后,每个部分可以实现单独的渐进演化,整个系统的实施可以采用并行方式进行。由于各子系统只是针对外观模式界面操作,所以各个子系统的不同版本可以同时协同工作,这样便于系统的动态实施。 外观模式对于子系统间耦合强的系统尤其有用,这一点对解决实际系统的同步实施很有帮助。在实际系统的实施中,往往由于各单位无法统一安排实施时间而被一拖再拖。6.系统演化 当渐进演化原有系统时,可以采用外观模式封装原系统。首先开发新系统的表示层,业务逻辑采用原有系统。然后逐步修改各个功能模块,并替换原有系统,如下图:

转载于:https://www.cnblogs.com/gnhao/archive/2013/01/24/2875144.html

Dot Net设计模式—外观模式相关推荐

  1. Python设计模式-外观模式

    Python设计模式-外观模式 代码基于3.5.2,代码如下; #coding:utf-8 # 外观模式class AlarmSensor:def run(self):print("Alar ...

  2. 设计模式--------外观模式

    设计模式--------外观模式 介绍外观模式的四大问题 现在的写法有什么问题吗? 为什么要用外观模式? 什么是外观模式? 外观模式有什么好处? 使用一个例子进行问题的说明 假如要制作一个智能系统,要 ...

  3. [设计模式]外观模式

    1. 定义 外观模式 提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更加容易使用. 外观不仅简化了系统内接口的使用,也将客户从组件中的子系统中解耦,外观和适配器都可 ...

  4. Java设计模式---外观模式

    外观模式(Facade) 外观模式的意图是:为子系统提供一个接口,便于它的使用. 解释: 简单的说,外观模式就是封装多个上层应用需要的方法,使得上层调用变得简单,为上层提供简单的接口,是设计模式中一种 ...

  5. Java 设计模式——外观模式

    概述 今天要说的外观模式是一个相对简单的设计模式,而且在日常的开发中,可能你也会时常使用它,只是你可能并未想过这是一个设计模式.本文会从一些实例着手,来对本文要说明的外观模式进行尽可能全面的讲解.希望 ...

  6. Java设计模式-外观模式

    我又来了,继Java设计模式之桥接模式后,现在来到了外观模式啦,外观模式又称为门面模式啦

  7. 大话设计模式—外观模式

    外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...

  8. 设计模式 外观模式 一键电影模式

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/25837275 这个模式比较简单,嘿嘿,简单写一下. 老样子,先看 外观模式(Fa ...

  9. 8. 设计模式 外观模式 一键电影模式

    这个模式比较简单,嘿嘿,简单写一下. 老样子,先看 外观模式(Facade Pattern)定义:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用.其实就是 ...

最新文章

  1. 自动驾驶前沿报告!解密六大关键技术,全球人才分布
  2. SaltStack状态导入(include)
  3. Git@OSC 增加 SVN 支持
  4. configSections 位置引起的错误
  5. Python创建删除文件(或文件夹)
  6. Lucene打分规则与Similarity模块详解
  7. 解析XML方式-DOM,SAX
  8. 第1章 游戏之乐——快速找出故障机器
  9. 201621123009 《Java程序设计》第二周学习总结
  10. Bootstrap研究1-精巧的网格布局系统
  11. 2020年墨天轮数据报告发布!
  12. eclipse jad
  13. 三维绘图之Mayavi.mlab
  14. 从零开始学ArcGIS Server(三)--如何创建一个个人地理数据库ArcSDE Personal geodatabase...
  15. DPDK QOS1 -- Linux HQOS的框架
  16. MySQL数据库将多条记录的单个字段合并成一条记录(GROUP_CONCAT)
  17. js检查ie低版本浏览器,并跳转更新页面
  18. 怎样用计算机制作思维导图,电脑如何制作思维导图?超简单思维导图制作方法...
  19. WEB渗透测试-安全白帽子修炼
  20. java f else_java else if 为什么比 switch 效率低?最好可以解释下原理

热门文章

  1. nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
  2. oc 自定义导航栏背景
  3. Leetcode#43Multiply Strings
  4. 同步线程和进程间的通信
  5. 9月22日我国垃圾邮件报告:湖北省再居榜首
  6. 转载 用python 获取当前时间
  7. 外中断03 - 零基础入门学习汇编语言71
  8. KeelKit 中集成了代码统计功能
  9. 从一起丢包故障来谈谈 nginx 中的 tcp keep-alive
  10. 1、在Centos上安装Grafana