外观模式又称门面模式,它是为了给子系统中提供一个一致的界面,从面定义了一个高层接口 ,这个接口使得这一子系统更加容易使用。定义中提到的子系统指在设计中为了降低复杂性根据一定的规则,对系统进行的划分,子系统封装有一些类,客户程序在使用子系统的时候,可能会像下图一样零乱。

上面的实现中,客户紧紧依赖在子系统的实现,如果子系统发生了变化,极有可能响应到客户类的调用,而且在子系统在不断优化时会产生更多的小类。

外观模式就是为了解决这种问题而产生的,下面是使用了门用模式后的图


 这样就明显减少了客户程序和子系统之间的偶合,增加了可维护性。

例子:

数据库连接这个例子在我们日常中很常用,在用JSP做页面开发的时候,我们经常会用到连接数据库,很多初学者都是直接用下面的代码(直接连接数据库,然后获得连接后直接进行增删改查)

public class DBCompare {Connection conn = null;PreparedStatement prep = null;ResultSet rset = null; try {Class.forName( "<driver>" ).newInstance();conn = DriverManager.getConnection( "<database>" );String sql = "SELECT * FROM <table> WHERE <column name> = ?";prep = conn.prepareStatement( sql );prep.setString( 1, "<column value>" );rset = prep.executeQuery();if( rset.next() ) {System.out.println( rset.getString( "<column name" ) );}} catch( SException e ) {e.printStackTrace();} finally {rset.close();prep.close();conn.close();}
}

但是这样的代码很有弊端,如我们如果想要换个数据库,这个时候就要大量改动代码

为了避免这种情况,我们就可以把获得连接抽象出来,从而在每次需要对数据库进行操作的时候,只需要获得连接。甚至也可以建立一个连接池。

public class DBCompare {String sql = "SELECT * FROM <table> WHERE <column name> = ?";  try {Mysql msql=new mysql(sql);prep.setString( 1, "<column value>" );rset = prep.executeQuery();if( rset.next() ) {System.out.println( rset.getString( "<column name" ) );}} catch( SException e ) {e.printStackTrace();} finally {mysql.close();mysql=null;}
}

优点:

1)对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便

2)它实现了子系统与客户之间在的耦合关系,而子系统内部的功能组件往往是紧耦合的,松耦合关系使得子系统的组件变化不会影响到它的客户,facad模式有助于建立层次结构系统,也有助于对对象之间原依赖关系分层,facade模式可以消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的时候极为重要。

设计模式之略见一斑(外观模式Facade)相关推荐

  1. 【白话设计模式二】外观模式(Facade)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  2. 《研磨设计模式》chap3 外观模式Facade

    1. 场景1 客户自己装机,需要一一去买配件:cpu.主板... 找专业的公司,由公司去处理: 2. 场景2 代码生成工具有4个模块 client使用时依次创建3个对象 public class Cl ...

  3. 设计模式之【外观模式-Facade】

    外观模式(Facade) 外观模式是为了解决类与类之家的依赖关系的 像spring一样,可以将类和类之间的关系配置到配置文件中 而外观模式就是将他们的关系放在一个Facade类中 降低了类类之间的耦合 ...

  4. 设计模式之八:外观模式(Facade)

    外观模式: 为子系统中的一系列接口提供了一个统一的界面.外观模式定义了一个高层次的接口以使子系统更加easy使用. Provide a unified interface to a set of in ...

  5. [设计模式-结构型]外观模式(Facade)

    概括 名称 Facade 结构 动机 为子系统中的一组接口提供一个一致的界面,F a c a d e 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 适用性 当你要为一个复杂子系统提供一 ...

  6. 外观模式(Facade)----设计模式

    外观模式(Facade)----设计模式 文章目录 外观模式(Facade)----设计模式 什么是外观模式呢? 外观模式的基本介绍 制造一个影院管理? 实现代码 总结 什么是外观模式呢? 以我们中常 ...

  7. 【设计模式】之外观(Facade)模式

    [设计模式]之外观(Facade)模式 外观模式是为了解决类与类之间的依赖关系的,将他们的关系放在一个Facade类中,降低了类类之间的耦合度. 图形化代码显示 源代码 //分支类 1,2,3代码类似 ...

  8. 如何让孩子爱上设计模式 ——11.外观模式(Facade Pattern)

    如何让孩子爱上设计模式 --11.外观模式(Facade Pattern) 标签: 设计模式初涉 场景引入 相信各位玩过LOL英雄联盟游戏的童鞋,对下面两个英雄都不会陌生吧:       分别是瑞雯和 ...

  9. 研磨设计模式之外观模式(Facade)(解决方案)

    3.2  解决方案 3.2.1  外观模式来解决 用来解决上述问题的一个合理的解决方案就是外观模式.那么什么是外观模式呢? (1)外观模式定义 这里先对两个词进行一下说明,一个是界面,一个是接口. 界 ...

最新文章

  1. cinder块存储配置使用lvm
  2. Oracle中实现continue的方法
  3. 伦巴时间步的动作要领_准军集结号,叶教官队列动作教学
  4. WordPress 常用数据库SQL查询语句大全
  5. 【C语言】利用二维数组输出成绩
  6. MongoDB 新功能介绍-Change Streams
  7. 浅析Linux Kernel 哈希路由表实现(一)
  8. python scrapy框架爬虫当当图书网
  9. c语言将整数的各个位数的数字分别提取_C语言学习:单位转换问题的一些思路...
  10. urllib 库的代替品 requests 的用法
  11. Java常用的设计模式
  12. Java 技术体系简介
  13. 解决——完美解决Anaconda打开Spyder5报错:link image0 hasn’t been detected!
  14. gitlab发邮件收不到
  15. vuejs搭建的项目对于ie浏览器的处理
  16. 洛谷P4207 [NOI2005]月下柠檬树(计算几何+自适应Simpson法)
  17. 人工智能在教育方面应用的思考(一)
  18. 在Mac上开启AptX
  19. flash 批量编译发布fla 文件
  20. Diary(一)——登录功能(上)

热门文章

  1. 马德里商标包括哪些国家?
  2. 华硕天选2wifi不见了
  3. VBA 校验身份证号
  4. 河南大学校园平面图数字化
  5. 这份职级薪资对标-美团3.3对标阿里P9?京东T8对标P8?,准吗?
  6. VUE项目开发,使用canvas实现图片签名编辑手写板功能
  7. 云原生之深入解析Kubernetes应用包管理器Helm的保姆级教程和实战
  8. 如何把7771网址大全删除
  9. 奔三了,悲催的IT职业生涯仍然没找到方向
  10. HBase 在爱奇艺的应用实践