设计模式-门面模式

门面模式

参考资料

图解设计模式

大话设计模式

设计模式之禅

github我见过最好的设计模式

http://c.biancheng.net/view/1326.html

定义

也称为外观模式

外观模式是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。

  • 让子系统更加容易使用,属于结构型模式

例子

App订单接口

  • 后台提供一个聚合接口

    • 在内部分别调用了订单,物流,用户系统

  • 能够节省前端的请求

适用场景

  • 子系统越来越复杂,增加门面模式来提供简单接口

  • 构建多层系统结构,利用门面对象作为每层的入口,简化层间调用

生活中的例子

  • 前台接待员

    • 用来做向导

  • 包工头

    • 通过包工头来找粉刷匠,找泥工等

通用写法

物流系统案例

门面业务帮我们聚合扣款,监测,发货的功能,客户端只需要找门面就行了

源码中的案例

Spring的JdbcUtils

public static boolean supportsBatchUpdates(Connection con) {  try {    DatabaseMetaData dbmd = con.getMetaData();    if (dbmd != null) {      if (dbmd.supportsBatchUpdates()) {        logger.debug("JDBC driver supports batch updates");        return true;      }      else {        logger.debug("JDBC driver does not support batch updates");      }    }  }  catch (SQLException ex) {    logger.debug("JDBC driver 'supportsBatchUpdates' method threw exception", ex);  }  return false;}

帮我们包装了对连接的操作,这样客户端只需要使用JdbcUtils就行了

Mybatis的Configuration

public MetaObject newMetaObject(Object object) {  return MetaObject.forObject(object, objectFactory, objectWrapperFactory, reflectorFactory);}public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {  ParameterHandler parameterHandler = mappedStatement.getLang().createParameterHandler(mappedStatement, parameterObject, boundSql);  parameterHandler = (ParameterHandler) interceptorChain.pluginAll(parameterHandler);  return parameterHandler;}public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler,                                            ResultHandler resultHandler, BoundSql boundSql) {  ResultSetHandler resultSetHandler = new DefaultResultSetHandler(executor, mappedStatement, parameterHandler, resultHandler, boundSql, rowBounds);  resultSetHandler = (ResultSetHandler) interceptorChain.pluginAll(resultSetHandler);  return resultSetHandler;}public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {  StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql);  statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler);  return statementHandler;}

帮我们创建对应的对象

和其他设计模式的区别

门面模式和代理的区别

  • 门面模式就是一种特殊的静态代理

  • 门面模式,重点在于封装

  • 静态代理,重点是在增强

不做增强的静态代理就是门面模式

门面模式和单例模式的区别

经常把门面模式做成单例模式,工具包

优缺点

优点

  • 简化了调用过程,无需深入了解子系统,防止给子系统带来风险

  • 减少系统依赖,松散耦合

  • 更好的划分访问层次,提高了安全性

  • 迪米特法则,最少知道原则

缺点

  • 增加子系统和扩展子系统行为的时候,容易带来未知风险

  • 不符合开闭原则

  • 某些情况下可能违背单一职责原则

问题

门面模式

想一想什么场景下考虑使用门面模式

  • 一个子系统比较复杂时,比如算法或者业务比较复杂,就可以封装出一个或多个门面出来,项目的结构简单,而且扩展性非常好。

  • 对于一个较大项目,为了避免人员带来的风险,也可以使用门面模式,技术水平比较差的成员,尽量安排独立的模块,然后把他写的程序封装到一个门面里,尽量让其他项目成员不用看到这些人的代码,看也看不懂,我也遇到过一个“高人”写的代 码,private方法、构造函数、常量基本都不用,你要一个public方法, 好,一个类里就一个public方法,所有代码都在里面,然后你就看吧, 一大坨程序,看着就能把人逼疯。使用门面模式后,对门面进行单元测试,约束项目成员的代码质量,对项目整体质量的提升也是一个比较好的帮助。

(0)

相关推荐

  • @万字长文 | MyBatis 缓存到底

    回复"面试"获取全套面试资料 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力. ...

  • Mybatis的sql组装详解

    上一篇分析了SqlSession执行sql的过程,其中并没有分析sql是从哪里来的,今天就来仔细分析下. Sql来源 从上一篇的最后一步执行sql那里倒推sql的来源,源码主要过程如下图: 可以看到最 ...

  • 阿里面试:Mybatis中方法和SQL是怎么关联起来的呢?

    回复"面试"获取全套面试资料 本文:3126字 | 阅读时长:4分10秒 今天是Mybatis源码分析第四篇,也是最后一篇. 老规矩,先上案例代码: public class My ...

  • 图解MyBatis

    回复"面试"获取全套面试资料 在以前文章中,我们对Mybatis进行了入门级的介绍教小师妹快速入门Mybatis,看这篇就够了,今天我们来从一个全局的角度看看Mybatis. 本文 ...

  • PHP设计模式之门面模式

    PHP设计模式之门面模式 门面模式,也叫外观模式.不管是门面还是外观,都是我们对外的媒介,就好像我们的脸面一样.所以,这个模式最大的特点就是要表现的"好看".怎么说呢?一堆复杂的对 ...

  • [PHP小课堂]PHP设计模式之门面模式

    [PHP小课堂]PHP设计模式之门面模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 设计模式-建造者模式

    建造者模式 也叫生成器模式,他是一个创建型模式 通用类图 Product产品类 ​通常是实现了模板方法模式,也就是有模板方法和基本方法. public class Product { public v ...

  • 设计模式-原型模式

    原型模式 ​原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,并且通过拷贝这些原型创建新的对象 ​调用者不需要知道任何创建细节,不调用构造函数 ​其属于一种创建型模式 通用类图 优点 性能 ...

  • 设计模式——策略模式

    什么是策略模式?策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化.举个例子? ...

  • C#设计模式-组合模式(Composite Pattern)

    概念 组合是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们. 组合模式(Composite Pattern)是将对象组合成树形结构以表示'部分-整体'的层次 ...

  • PHP设计模式—访问者模式

    定义: 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构: Visitor:抽象访问者,为该对象结构中Co ...

  • C#设计模式-桥接模式(Bridge Pattern)

    引言 例如我有好几个项目,需要外包出去做各种类型的测试,不同的公司基础费用不同,不同的测试类型价格也是不同的.此时不同的项目选择不同的公司和不同类型的测试进行测试价格都是不同的.于是我们可以创建一个项 ...

  • PHP设计模式—迭代器模式

    定义: 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 结构: Iterator:迭代器接口,用于定义得到开始对象.得到下一个对象.判断是否到 ...