首页 > 编程知识 正文

门面不明显有什么办法(有个门面房不知道做什么)

时间:2023-05-03 10:19:31 阅读:92399 作者:171

1 使用门面模式整合已知API的功能

一般的EC平台将许多子系统合并形成一个大型购物平台。 一般来说,许多现成的功能不是重新开发,而是必须将现有的各子系统对接。 这些子系统可能涉及积分系统、支付系统、物流系统的接口调用。 如果前端发送网络请求来调用所有接口调用,则会增加前端开发人员的难度,二是会增加一些网络请求,从而影响页面性能。 此时,可以发挥门模式的优越性。 通过将所有现有接口合并到一个类中,并为前端提供统一的接口来调用,前端开发人员无需在意各个接口的业务关系,可以集中精力进行页面交互我们用代码模拟积分兑换礼物的商业场景。 首先制作礼物的实际体系GiftInfo。

公共类gift信息

私有字符串名称;

公共信息(字符串名称) {

this.name=名称;

}

公共字符串通用名称

返回名称;

}

}

然后,为每个子系统编写业务逻辑代码,并创建点系统QualifyService类。

公共类质量服务{2}

公共资源可用性(giftinfogiftinfo ) {

System.out.println ('检查' giftInfo.getName ) '点资格通过,库存通过) );

返回真;

}

}

创建支付系统支付服务类。

公共类支付服务{

公共石油公司(giftinfopointsgift ) {

//减去积分

System.out.println (“支付”“点gift.getname”“点成功”);

返回真;

}

}

创建物流系统shipping服务类。

公共类出货服务{2}

//出货

公共字符串传递(giftinfogiftinfo ) {

//物流系统的对接逻辑

system.out.println (gift info.getname )“进入物流系统”);

String shippingOrderNo='666 ';

返回出货订单;

}

}

接下来,为外观角色创建GiftFacadeService类,并将三个子系统的所有功能集成到exchange (仅向外部开放一个交换礼物的方法,exchange )方法内部。

公共类giftfacadeservice

privatequalifyservicequalifyservice=newqualifyservice (;

privatepaymentservicepointspaymentservice=newpaymentservice (;

privateshippingserviceshippingservice=newshippingservice (;

//兑换

公共语音交换(giftinfogiftinfo ) {

if (质量服务. is可用(gift信息) ) ) )。

//资格检查通过

if (pointspaymentservice.pay (gift信息) ) ) )。

//积分支付成功时

stringshippingorderno=shipping服务.传送(gift信息);

System.out.println (物流系统订单成功,订单编号为: ) shippingorderno );

}

}

}

}

最后,让我们看看客户端代码。

publicstaticvoidmain (字符串[ ]数组) {

giftinfogiftinfo=newgiftinfo (' 《Spring 5核心原理》 );

giftfacadeservicegiftfacadeservice=newgiftfacadeservice (;

giftfacadeservice.exchange (gift信息;

}

运行结果如下图所示。

00a338?from=pc">

通过这样一个案例对比,相信大家对门面模式的印象就非常深刻了。

2 门面模式在Spring源码中的应用

先来看Spring JDBC模块下的JdbcUtils类,它封装了与JDBC相关的所有操作,代码片段如下。

public abstract class JdbcUtils { public static final int TYPE_UNKNOWN = -2147483648; private static final Log logger = LogFactory.getLog(JdbcUtils.class); public JdbcUtils() { } public static void closeConnection(Connection con) { if(con != null) { try { con.close(); } catch (SQLException var2) { logger.debug("Could not close JDBC Connection", var2); } catch (Throwable var3) { logger.debug("Unexpected exception on closing JDBC Connection", var3); } } } public static void closeStatement(Statement stmt) { if(stmt != null) { try { stmt.close(); } catch (SQLException var2) { logger.trace("Could not close JDBC Statement", var2); } catch (Throwable var3) { logger.trace("Unexpected exception on closing JDBC Statement", var3); } } } public static void closeResultSet(ResultSet rs) { if(rs != null) { try { rs.close(); } catch (SQLException var2) { logger.trace("Could not close JDBC ResultSet", var2); } catch (Throwable var3) { logger.trace("Unexpected exception on closing JDBC ResultSet", var3); } } } ... }

更多其他操作,看它的结构就非常清楚了,如下图所示。

3 门面模式在MyBatis源码中的应用

再来看一个MyBatis中的Configuration类,其中有很多new开头的方法,源码如下。

public MetaObject newMetaObject(Object object) { return MetaObject.forObject(object, this.objectFactory, this.objectWrapperFactory, this.reflectorFactory); } public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) { ParameterHandler parameterHandler = mappedStatement.getLang().createParameterHandler(mappedStatement, parameterObject, boundSql); parameterHandler = (ParameterHandler)this.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 = (ResultSetHandler)this.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 = (StatementHandler)this.interceptorChain.pluginAll (statementHandler); return statementHandler; } public Executor newExecutor(Transaction transaction) { return this.newExecutor(transaction, this.defaultExecutorType); }

上面这些方法都是对JDBC中关键组件操作的封装。

4 门面模式在Tomcat源码中的应用

另外,门面模式在Tomcat的源码中也有体现,也非常有意思。以RequestFacade类为例,来看其源码。

public class RequestFacade implements HttpServletRequest { ... @Override public String getContentType() { if (request == null) { throw new IllegalStateException( sm.getString("requestFacade.nullRequest")); } return request.getContentType(); } @Override public ServletInputStream getInputStream() throws IOException { if (request == null) { throw new IllegalStateException( sm.getString("requestFacade.nullRequest")); } return request.getInputStream(); } @Override public String getParameter(String name) { if (request == null) { throw new IllegalStateException( sm.getString("requestFacade.nullRequest")); } if (Globals.IS_SECURITY_ENABLED){ return AccessController.doPrivileged( new GetParameterPrivilegedAction(name)); } else { return request.getParameter(name); } } ... }

从名字就知道它用了门面模式。它封装了非常多的request操作,也整合了很多servlet-api以外的内容,给用户使用提供了很大便捷。同样,Tomcat针对Response和Session也封装了对应的ResponseFacade类和StandardSessionFacade类,感兴趣的小伙伴可以深入了解一下。

小伙伴们是不是意外地发现,你每天都在用门面模式?

【推荐】Tom弹架构:30个设计模式真实案例,挑战年薪60W不是梦

本文为“Tom弹架构”原创,转载请注明出处。技术在于分享,我分享我快乐!如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。私信回复"666"或关注微信公众号『 Tom弹架构 』可获取更多技术干货!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。