立面设计模式–设计观点

在上一篇文章中,我们描述了适配器设计模式 。 在今天的文章中,我们将展示另一种类似的“四结构帮派”模式 。 顾名思义,结构模式用于从许多不同的对象形成更大的对象结构。 外观模式就是这样一种模式,它为系统内的一组接口提供了简化的接口,因此对客户端隐藏了子系统的复杂性。

何时使用外墙图案?

分层:外观模式可以在JEE应用程序中用于创建一个层,以抽象和统一应用程序中的相关接口。 使用外观将为每个子系统级别定义一个入口点,从而使它们只能通过其外观进行通信。 这样可以简化它们之间的依赖关系。

Façade使API和库更易于使用,有利于维护和可读性。 它还可以使用单个简化的API整理和抽象各种设计不当的API。

它还减少了外部代码对库内部工作的依赖性,从而提供了灵活性。

立面设计图案结构

在上述Façade模式的结构中,Façade类将子系统与客户端隔离。 客户端仅与Façade类进行交互,而无需了解子系统类。

例:

让我们以在线订单处理网站为例。 客户在不了解内部类如何工作的情况下下了订单。 下订单后,外观类层将调用子系统的方法(例如,用于库存检查的“库存”和用于处理付款的“付款”)。 处理后,它将控制返回给客户端类,并带有关于正在处理的订单的确认。

顺序图:

外墙设计顺序图

代码示例:

Inventory.java –

public class Inventory {public String checkInventory(String OrderId) {return 'Inventory checked';}
}

Payment.java

public class Payment {public String deductPayment(String orderID) {return 'Payment deducted successfully';}
}

OrderFacade.java

public class OrderFacade {private Payment pymt = new Payment();private Inventory inventry = new Inventory();public void placeOrder(String orderId) {String step1 = inventry.checkInventory(orderId);String step2 = pymt.deductPayment(orderId);System.out.println('Following steps completed:' + step1 + ' & ' + step2);}
}

客户端程序

public class Client {public static void main(String args[]){OrderFacade orderFacade = new OrderFacade();orderFacade.placeOrder('OR123456');System.out.println('Order processing completed');}
}


优点:

  • 我们可以使用façade模式来整理所有复杂的方法调用和相关的代码块,并将其通过一个单独的Façade类进行通道化。 这样,对于客户而言,只有一个呼叫。 即使我们更改了子系统包/类及其逻辑,也不会影响客户端调用。 简而言之,这增加了松散的耦合。
  • 它使创建和使用更加结构化的环境变得更加容易使用和维护,并减少了库或其他软件包之间的依赖性。


缺点/后果:

  • 缺点之一是子系统方法连接到Façade层。 如果子系统的结构发生变化,则需要随后对Façade层和客户端方法进行更改。


有趣的一点:

外墙样式可能与调解人样式混淆。 中介器还以类似于外观的方式抽象了子系统的功能。 但是,这两种模式之间存在细微的差异。 在中介程序模式的情况下,子系统知道中介程序,但是在立面的情况下,子系统对立面一无所知。 这是从Façade到子系统的一种单向通信。

Java API中使用的外观

  • javax.servlet.http.HttpSession
  • javax.servlet.http.HttpServletRequest
  • javax.servlet.http.HttpServletResponse
  • javax.faces.context.ExternalContext


参考:立面 设计模式–来自我们的JCG合作伙伴 Mainak Goswami在Idiotechie博客上的设计观点 。

翻译自: https://www.javacodegeeks.com/2012/11/facade-design-pattern-design-standpoint.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java第三次作业 1502 马 帅

《Java技术》第三次作业 (一)学习总结 1.书中对面向对象封装性的定义为:指把对象的属性和行为看成一个密不可分的整体,把不需要让外界知道的信息隐蔽起来。简单来说,就是定义的一些对象,只有在本类中才可以…

sass运算

sass具有运算的特性,可以对数值型的Value(如:数字、颜色、变量等)进行加减乘除四则运算。 请注意运算符前后请留一个空格,不然会出错。 scss.style css.style 本文转载于:猿2048https://www.mk2048.com/blog/blog.php?idiij12j&titles…

JavaOne 2012:NetBeans.Next –未来路线图

我从Continental Ballroom 4和一个NetBeans主题( 项目Easel )到Continental Ballroom 5,走了必要的几个步骤,以查看另一个面向NetBeans的演示文稿:“ NetBeans.Next –未来路线图”。 Ashwin Rao发起了“羽毛之鸟”&am…

C#复习正则表达式

由于前段时间为了写工具学的太J8粗糙 加上最近一段时间太浮躁 所以静下心来复习 一遍以前学的很弱的一些地方1 委托 public delegate double weituo(double a, double b);public static double test1(double a,double b){return a * b;}public static double test2(double a,…

在vue中安装使用vux

最近因为的工作的原因在弄vue,从后端弄到前端之前一直用js,现在第一次接触vue感觉还挺有意思的,就是自己太菜了,这个脑子呀。。。。不太够用。。。。。页面设计用了一个叫vux的东西,vux可以提供一些组件,用…

Zabbix全方位告警接入-电话/微信/短信都支持

http://www.cnblogs.com/baidu-gaojing/p/5128035.html 百度告警平台地址: http://gaojing.baidu.com 联系我们: 邮箱:gaojingbaidu.com 电话:13924600771 QQ群:183806029 对于使用zabbix的用户,要接入百度…

Spring MVC定制用户登录注销实现示例

这篇文章描述了如何实现对Spring MVC Web应用程序的自定义用户访问(登录注销)。 作为前提,建议读者阅读这篇文章 ,其中介绍了一些Spring Security概念。 该代码示例可从Spring-MVC-Login-Logout目录中的Github获得。 它从带有注释…

HTML5与CSS3权威指南笔记案例1

第1章 <!DOCTYPE html> <meta charset "UTF-8"> <title> Search </title> <form> <p><label>Search&#xff1a;<input name"search" autofocus></label> </p> </form> <!DOCTYPE&…

java循环的概念_Java数据结构之循环队列简单定义与用法示例

本文实例讲述了Java数据结构之循环队列简单定义与用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;一、概述&#xff1a;1、原理&#xff1a;与普通队列的区别在于循环队列添加数据时&#xff0c;如果其有效数据end maxSize - 1(最大空间)的话&#xff0c;end指针…

sass变量

sass变量用法 1、sass变量必须以$符开头&#xff0c;后面紧跟着变量名 2、变量值和变量名之间就需要使用冒号(:)分隔开&#xff08;就像CSS属性设置一样&#xff09; 3、如果值后面加上!default则表示默认值 默认变量 sass的默认变量&#xff1a;仅需要在值后面加上!defaul…

根据您的命令-命令设计模式

命令设计模式是一种广为人知的设计模式&#xff0c;它属于行为设计模式&#xff08;“四人帮”的一部分&#xff09;。 顾名思义&#xff0c;它与应用程序中的动作和事件有关。 问题陈述&#xff1a; 假设有一个网页将在其中包含多个菜单的情况。 编写此代码的一种方法是使条件…

用js和jQuery做轮播图

Javascript或jQuery做轮播图 css样式 <style> a{ text-decoration:none; } .naver{ width: 100%; position:relative; }.images{position:relative;width: 100%;height: 400px; } .images img{position:absolute;left: 0;top: 0;width: 100%;height: 400px;opacity: 0;fi…

【开发调试】谷歌浏览器中调试移动网页和测试网速下页面效果

、 今天有幸给大家分享一下谷歌浏览器针对移动网页测试的技巧&#xff0c;主要是最近做个微信公共号网站。所以就要对页面测试拉。移动网页我们最长测得就是各种手机大小的页面效果和出现网络问题的效果展示。 今天就简单分享下在谷歌浏览器测试页面的适配和网速限制展示。…

拼多多分享好友砍价Java实现_拼多多砍价怎么分享到朋友圈 砍价发到微信朋友圈方法...

拼多多是一款电商社交的共享式购物平台&#xff0c;现在还推出了砍价的活动&#xff0c;只要邀请好友砍价&#xff0c;你就以最低的价格购买商品&#xff0c;还可以可能是免费拿到&#xff0c;那么今天小编就给大家讲讲如何将自己的砍价信息分享到微信朋友圈。首先下载手机拼多…

通过6个简单的步骤在Windows上运行Apache Hive

注意 &#xff1a;您需要安装cygwin才能运行本教程&#xff0c;因为Hadoop&#xff08;Hive需要&#xff09;需要cygwin才能在Windows上运行。 至少&#xff0c;系统中必须存在Basic&#xff0c;Net&#xff08;OpenSSH&#xff0c;tcp_wrapper软件包&#xff09;和与安全相关的…

vue 环境的搭建及初始化项目

其实超级简单&#xff0c;虽然网上很多&#xff0c;但是我顺便记录下相当于做笔记吧 1nodejs 的安装&#xff0c; 在node官网下载&#xff0c;点击安装&#xff0c;安装的时候最好选择路径在d盘 2设置环境变量 我的电脑-->属性-->系统环境变量- 系统变量新增一个NODE…

Java堆转储:您可以完成任务吗?

如果您像我一样对Java性能充满热情&#xff0c;那么堆转储分析对您来说应该不是一个谜。 如果是这样&#xff0c;那么好消息是您将有机会提高您的Java故障诊断技能和JVM知识。 JVM现已发展到今天&#xff0c;与旧的JDK 1.0 – JDK 1.4天相比&#xff0c;今天生成和分析JVM堆转…

java 调用 ictclas50_1-Ictclas50分词系统ForJava

Ictclas50是一个分词库&#xff0c;我嘛主要用来做中文分词&#xff0c;其也能分出词性等东西。1.环境搭建进入到下载页面进行下载&#xff1a;如下图&#xff1a; 因为我的系统是64位的windows&#xff0c;所以选择了到数第三行进行下载。其JAVA版本是通过JNI去调用dll库&…

Beam概念学习系列之Pipeline Runners

不多说&#xff0c;直接上干货&#xff01; https://beam.apache.org/get-started/beam-overview/ 在 Beam 管道上运行引擎会根据你选择的分布式处理引擎&#xff0c;其中兼容的 API 转换你的 Beam 程序应用&#xff0c;让你的 Beam 应用程序可以有效的运行在指定的分布式处理引…

运行 java classnotfound_JAR运行出现ClassNotFoundException异常的解决办法

2009年10月30日最近在弄个聊天室,由于要跟数据库通信,用到了JDBC的3个jar,在eclipse里OK的,但布置到服务器坏事了,不知道怎么弄JDBC的3个jar了写个autoStart.batjava -jar chatServer.jarpause运行报错:F:\mydocuments\java project\socketTest\release>java -jar chatServe…