css外墙法_外墙设计模式示例

css外墙法

本文是我们名为“ Java设计模式 ”的学院课程的一部分。

在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 !

目录

1.简介 2.什么是立面模式 3.解决问题 4.使用外观模式 5.下载源代码

1.简介

在本课程中,我们将讨论另一种结构模式,即立面模式。 但是在深入研究它的细节之前,让我们讨论一个将通过此特定模式解决的问题。

您的公司是一家基于产品的公司,并且已在市场上推出了名为Schedule Server的产品。 它本身是一种服务器,用于管理作业。 这些工作可以是任何类型的工作,例如发送电子邮件列表,短信,从目标位置读取或写入文件,或者只是将文件从源位置传输到目标位置。 开发人员可以使用该产品来管理此类工作,并能够将更多精力集中于他们的业务目标。 服务器在指定的时间执行每个作业,并且还单独管理所有下划线问题,例如并发问题和安全性。 作为开发人员,只需要编码相关的业务需求,并提供了大量的API调用即可根据他们的需求安排工作。

一切都进行得很好,直到客户端开始抱怨启动和停止服务器进程。 他们说,尽管服务器运行良好,但是初始化和关闭过程却非常复杂,他们希望有一种简便的方法来做到这一点。 服务器向客户端公开了一个复杂的接口,这些接口看上去对他们来说有些忙。

我们需要提供一种启动和停止服务器的简便方法。

与客户端的复杂接口已经被认为是当前系统设计中的故障。 但是幸运的是,我们无法从头开始设计和编码。 我们需要一种解决此问题并使界面易于访问的方法。

外观模式可以帮助我们解决此设计问题。 但是在此之前,让我们了解一下外观模式。

2.什么是立面模式

Facade模式使用Facade类使复杂的界面易于使用。 外观模式为子系统中的一组接口提供了统一的接口。 Facade定义了一个更高级别的界面,使子系统更易于使用。

Facade统一了子系统的复杂底层接口,以便提供一种访问该接口的简单方法。 它只是为子系统的复杂接口提供了一层,使其更易于使用。

Facade不封装子系统类或接口; 它只是为其功能提供了简化的界面。 客户端可以直接访问这些类。 它仍然为可能需要它的客户提供系统的全部功能。

Facade不仅能够简化界面,而且还可以使客户端与子系统分离。 它遵循最小知识原则,该原则避免了客户端与子系统之间的紧密耦合。 这提供了灵活性:假设在上述问题中,公司希望添加更多具有相同接口的步骤来启动或停止Schedule Server。 如果您将客户端代码编码到Facade而不是子系统上,则无需更改客户端代码,只需更改Facade,它将随新版本一起提供给客户端。

客户端通过向Facade发送请求来与子系统进行通信,该请求会将其转发到适当的子系统对象。 尽管子系统对象执行实际工作,但是外观可能必须完成其自身的工作才能将其接口转换为子系统接口。 使用外观的客户端不必直接访问其子系统对象。

请注意, 与适配器相同的Facade可以包装多个类,但是将Facade用于接口可简化复杂接口的使用,而适配器可用于将接口转换为客户端期望的接口。

图1

图1

3.解决问题

客户端在使用Schedule Server时面临的问题是服务器启动和停止其服务所带来的复杂性。 客户想要一种简单的方法。 以下是客户端启动和停止服务器所需编写的代码。

ScheduleServer scheduleServer = new ScheduleServer();

要启动服务器,客户端需要创建ScheduleServer类的对象,然后需要按顺序调用以下方法来启动和初始化服务器。

scheduleServer.startBooting();
scheduleServer.readSystemConfigFile();
scheduleServer.init();
scheduleServer.initializeContext();
scheduleServer.initializeListeners();
scheduleServer.createSystemObjects();System.out.println("Start working......");
System.out.println("After work done.........");

要停止服务器,客户端需要以相同的顺序调用以下方法。

scheduleServer.releaseProcesses();
scheduleServer.destory();
scheduleServer.destroySystemObjects();
scheduleServer.destoryListeners();
scheduleServer.destoryContext();
scheduleServer.shutdown();

这对他们来说似乎是一个负担,他们对做所有这些事情都不感兴趣,为什么要这么做? 即使对于一些可能对系统的低级界面感兴趣的客户来说,这看起来很有趣,但他们中的大多数人都不喜欢它。

为了解决这个问题,我们将创建一个将包装服务器对象的Facade类。 此类将为客户端提供简单的接口(方法)。 这些接口在内部将调用服务器对象上的方法。 首先让我们看一下代码,然后再讨论它。

package com.javacodegeeks.patterns.facadepattern;public class ScheduleServerFacade {private final ScheduleServer scheduleServer;public ScheduleServerFacade(ScheduleServer scheduleServer){this.scheduleServer = scheduleServer;}public void startServer(){scheduleServer.startBooting();scheduleServer.readSystemConfigFile();scheduleServer.init();scheduleServer.initializeContext();scheduleServer.initializeListeners();scheduleServer.createSystemObjects();}public void stopServer(){scheduleServer.releaseProcesses();scheduleServer.destory();scheduleServer.destroySystemObjects();scheduleServer.destoryListeners();scheduleServer.destoryContext();scheduleServer.shutdown();}}

上面的ScheduleServerFacade类是Facade类,它包装ScheduleServer对象,它通过其构造函数实例化服务器对象,并具有两个简单方法: startServer()stopServer() 。 这些方法在内部执行服务器的启动和停止。 客户端只需要调用这些简单的方法即可。 现在,无需调用所有生命周期和销毁方法,只需简单的方法和其余过程将由facade类执行。

下面的代码显示了Facade如何使复杂的界面易于使用。

package com.javacodegeeks.patterns.facadepattern;public class TestFacade {public static void main(String[] args) {ScheduleServer scheduleServer = new ScheduleServer();ScheduleServerFacade facadeServer = new ScheduleServerFacade(scheduleServer);facadeServer.startServer();System.out.println("Start working......");System.out.println("After work done.........");facadeServer.stopServer();}}

另外,请注意,尽管Facade类为复杂的子系统提供了一个简单的接口,但它没有封装子系统。 客户端仍然可以访问子系统的低级接口。 因此,外观提供了一个额外的层,即到复杂子系统的简单接口,但是它并未完全隐藏对复杂子系统的低层接口的直接访问。

4.使用外观模式

在以下情况下使用外观模式:

  1. 您想为复杂的子系统提供一个简单的接口。 随着子系统的发展,它们通常会变得更加复杂。 多数模式在应用时会导致更多和更少的类。 这使得子系统更加可重用并且更易于自定义,但是对于不需要自定义子系统的客户端来说,也变得更加难以使用。 外观可以提供子系统的简单默认视图,足以满足大多数客户端的需求。 只有需要更多可定制性的客户才需要超越外观。
  2. 客户端与抽象的实现类之间存在许多依赖关系。 引入外观以使子系统与客户端和其他子系统分离,从而提高子系统的独立性和可移植性。
  3. 您可以对子系统进行分层。 使用外观来定义每个子系统级别的入口点。 如果子系统是依赖的,则可以通过使子系统仅通过其外观相互通信来简化它们之间的依赖关系。

5.下载源代码

这是有关立面模式的课程。 您可以在此处下载源代码: FacadePattern-Project

翻译自: https://www.javacodegeeks.com/2015/09/facade-design-pattern.html

css外墙法

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

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

相关文章

设计模式示例_桥梁设计模式示例

设计模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

数值分析 使用c语言 源码_分析源码,学会正确使用 Java 线程池

在日常的开发工作当中,线程池往往承载着一个应用中最重要的业务逻辑,因此我们有必要更多地去关注线程池的执行情况,包括异常的处理和分析等。本文主要聚焦在如何正确使用线程池上,以及提供一些实用的建议。文中会稍微涉及到一些线…

设计模式示例_状态设计模式示例

设计模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

cam350 不能打开光绘文件_如何在CAM350中导入Allegro光绘

内容简介:本人之前遇到过 CAM350 导入 Allegro 格式光绘后钻孔偏移、异型孔不显示的问题,捣鼓过之后找到一个方法,在 Allegro 群友的建议下制作该文档进行适当的说明。1. 导入 Gerber 文件鉴于手工导入 Gerber 文件需要逐层设置,过…

d3js mysql_D3.js入门指南

近期略有点诸事不顺,趁略有闲余之时,玩起D3.js。之前实际项目中主要是用各种chart如hightchart、echarts等,这些图形库玩起来貌都是完美的,一切皆可配置,但几年前接触了D3之后,觉得前面那chart类库局限的地…

layui templet格式化_layui使用templet格式化表格数据的方法

增加js/*---------------------格式化时间开始--------------------------*///对Date的扩展,将 Date 转化为指定格式的String//月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,//年(y)可以用 1-4 个占位符,毫秒(S)只能用…

设计模式示例_代理设计模式示例

设计模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

mysql insert 字符集_有关 MySQL 字符集的注意事项-爱可生

本文关键字:字符集、建库建表一、数据库和字符集1. 建库时指定创建数据库时,显式指定字符集和排序规则,同时,当切换到当前数据库后,参数 character_set_database,collation_database 分别被覆盖为当前显式指…

c#发送讯息_企业讯息

c#发送讯息本文是我们名为“ EAI的Spring集成 ”的学院课程的一部分。 在本课程中,向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来,您将深入研究Spring Integration的基础知识,例如通道,转换器和适…

java cr_WildFly 10 CR 2发布– Java EE 7,Java 8,Hibernate 5,JavaScript支持热重载

java cr昨天,WildFly团队发布了最新版本的WildFly 10 。 CR2很可能是预计于十月份发布最终版本之前的最后一个版本。 即使主要支持的Java EE规范是7,WildFly 8和WildFly 9也提供了许多新功能,而WildFly 9和WildFly 9现在制作了三个服务器版本…

侬娜·杰尔_杰尔·地狱

侬娜杰尔什么是JAR地狱? (或者是classpath地狱?还是依赖地狱?)在考虑使用Maven或OSGi等现代开发工具时,哪些方面仍然有意义? 有趣的是,似乎没有对这些问题的结构化答案(…

Mysql运行在内核空间_思考mysql内核之初级系列6—innodb文件管理 | 学步园

在上一篇里面,bingxi和alex思考了information_schema,这个一直在innodb外围打转。没有进入到innodb的内部。在后续的文章中,以innodb的为主,逐个思考。Bingxi和alex今天了解了fil文件管理。对应的文件为:D:/mysql-5.1.…

pcl_openmap_OpenMap教程第2部分–使用MapHandler构建基本地图应用程序–第1部分

pcl_openmap1.简介 在第一个教程中,我们创建了一个基本的OpenMap GIS应用程序,该应用程序在JFrame中显示一个从文件系统加载的具有一个形状图层的地图。 该教程基于com.bbn.openmap.app.example.SimpleMap 。 在该教程中,我们使用了以下OpenM…

mysql7.5安装教程_CentOS7.5下yum安装MySQL8图文教程

卸载MariaDB1.列出所有安装的MariaDB rpm 包rpm -qa | grep mariadb2.强制卸载rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64安装MySQL1. 环境CentOS7.52. 获取MySQL最新版 rpm包yum仓库下载MySQLyum localinstall https://repo.mysql.com//mysql80-community-release-e…

mysql和sqlserver分页的区别_关于SQLServer和MySQL 查询分页语句区别

首先来定义几个要用到的参数(例子)t_user数据表int currentPage ; //当前页int pageRecord ; //每页显示记录数关于SqlServer数据库分页SQL语句为:String sql "select top "pageRecord " * from t_user where id not in (select top "(currentPage-1)*pag…

java 微型数据库_Java 9代码工具:使用Java微型基准测试工具的实践会话

java 微型数据库用肉眼看,基准测试似乎只是确定执行某些代码需要花费多长时间的简单问题。 但是,通常情况下,这是幼稚的方法。 提供具有准确和可重复结果的有意义的基准并非易事。 在本文中,我们将向您介绍OpenJDK代码工具项目&a…

mysql快速随机_MySQL随机取数据最高效的方法

mysql随机取数据最高效率的方法发现在SQL语句里有一个 ORDER BY rand() 这样的一个语句,这个说是用着方便,但是效率实在是太低了,于是我用了以下的方法来优化,就是用JOIN表的方法来达到这个取随机数据行的方法,你可以用…

部署被测软件应用和中间件_使用FlexDeploy对融合中间件应用程序进行自动化软件测试...

部署被测软件应用和中间件自动化软件测试是任何软件组织都必须执行的强制性活动之一,以保证其产品质量。 但是,此过程通常变得相当复杂,尤其是涉及由多个不同部分组成的现代复杂系统的自动化测试时。 所有这些部分都基于不同的技术&#xff0…

投行数据_投行对Java的二十大核心访谈问答

投行数据这是在金融领域(主要是在大型投资银行)共享Java核心访谈问题和答案的新系列。 在JP Morgan,Morgan Stanley,Barclays或Goldman Sachs上会问许多这些Java面试问题。 银行主要从多线程 , 集合 ,序列化…

primefaces_通过OmniFaces缓存组件以编程方式缓存PrimeFaces图表

primefaces在这篇文章中&#xff0c;您将看到如何结合PrimeFaces和OmniFaces获得可缓存的图表。 为了使事情变得简单&#xff0c;我们将使用PrimeFaces 折线图。 对于这种图表&#xff0c;我们可以在页面中使用<p&#xff1a;chart />标签和一个简单的托管bean。 因此&am…