java设计模式 订阅模式_Java中的外观设计模式

java设计模式 订阅模式

立面是指建筑物的外观。 当穿过街道时,我们所看到的只是建筑物的外观。 该工作面抽象了建筑物的所有复杂实现细节。

同样, 外观设计模式旨在为子系统中的一组接口提供统一的接口。 这个统一的接口对客户端隐藏了子系统的复杂性。 它属于结构模式类别。

Java中的java.util.Connection是外观,因为它允许我们创建数据库连接并隐藏实现细节。 同样, java.net。 URL类是另一个外观,它公开了隐藏所有涉及细节的openStream()方法。

外观模式通常是重构模式。 对于大型复杂子系统,使用外观模式并为客户提供友好的界面进行交互是一个相当不错的主意。

实施外观模式:

让我们首先定义一个接口– BookGenre

 public interface BookGenre { List<Book> getBookList();  } 

代表不同书籍类别的所有类都将实现此接口:

 public class Fiction implements BookGenre { ...  }   public class NonFiction implements BookGenre { ...  }   public class Technology implements BookGenre { ...  } 

我们可以让客户自己与所有子系统类进行交互,以借用一本书。

但是为了简化起见,让我们创建一个LibraryService作为外观,它将公开以下功能:

 public enum BookType { FICTION, NONFICTION, TECHNOLOGY }   public class LibraryService {  private BookGenre fiction; private BookGenre nonFiction; private BookGenre technology;  public LibraryService() { this .fiction = new Fiction(); this .nonFiction = new NonFiction(); this .technology = new Technology(); }  public void borrowBook(BookType type, String name) { List<Book> books; switch (type) { case FICTION: books = this .fiction.getBookList(); break ; case NONFICTION: books = this .nonFiction.getBookList(); break ; default : books = this .technology.getBookList(); }  Book book = BookService.findBookByName(books, name); book.setAvailability( false ); }  ...  } 

为了使实现简单,我们在此假设每个书名只有一本书。

请注意,我们尚未添加任何其他功能。 方法借书()使用现有的子系统API来执行此操作。

UML图:

我们可以将上面的示例表示为:

有了这个外观,我们的客户就可以直接与其交互,而不必自己处理系统内部细节。

值得注意的要点:

让我们快速回顾一些要点:

  • 充当子系统的入口点,并且不向子系统添加更多功能
  • 隐藏在门面类后面的子系统的复杂性; 简化了客户端的访问点
  • 消除了客户端类自行管理子系统的需要
  • 促进客户端和子系统之间的松散耦合
  • 外观类绝不限制客户对子系统的直接访问
  • 我们可以根据需要为复杂系统创建任意数量的外观。 这样做的目的是使客户端易于访问
  • 努力维护额外的代码层,并使它与我们的子系统所进行的更改保持同步

结论:

在本教程中,我们探索了另一种称为外观模式的结构设计模式。 这是一种重构模式,主要用于为复杂且设计欠佳的子系统提供更简单的外观。

翻译自: https://www.javacodegeeks.com/2019/08/facade-design-pattern-java.html

java设计模式 订阅模式

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

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

相关文章

dnn模型 list index out of range_基于svm的财务预警模型

前言本文将我国A股上市公司作为研究对象&#xff0c;选取了A股 2015-2019 年度被 ST 或被 *ST上市公司&#xff0c;剔除了部分非财务原因导致ST或*ST的上市公司。财务指标选择了T-3期的资产负债率、流动比率、应收账款周转率等10个财务指标。数据收集及预处理导入所需要库 im…

汇编操作显存

【0】README 0.1&#xff09;本文转自&#xff1a; http://www.cnblogs.com/youxin/archive/2012/05/21/2512329.html for relative source code , please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/lib.inc 【1】关于 80*25彩色字符模式显示缓冲区&…

Hibernate中的实体对象的三种状态

对于 Hibernate 而言&#xff0c;实体对象的状态分为三种&#xff1a; 1.暂时态 当对象刚创建&#xff0c;和 Session 没有发生任何关系时&#xff0c;当程序运行完就立刻消失&#xff0c;被称为暂时态。 2.持久态 持久态的对象和 Session 发生了关系&#xff0c;如执行了 ses…

java设计模式之状态模式_Java中的状态设计模式

java设计模式之状态模式在本教程中&#xff0c;我们将探讨另一种流行的行为设计模式-状态设计模式。 当我们使用可以存在于多个状态的对象时&#xff0c;状态设计模式的知识变得非常有用。 当对象的行为取决于其当前状态时&#xff0c;我们应该主要使用它。 这种模式有助于我们…

php概率计算_PHP指定概率算法

PHP指定概率算法&#xff0c;可用于刮刮卡&#xff0c;大转盘等抽奖算法。假设&#xff1a;有一个二维数组&#xff0c;记录了所有本次抽奖的奖项信息&#xff1a;$test_arr array(a>20,b>30,c>50);a奖概率20%&#xff0c;b奖概率30%&#xff0c;c奖概率50%模拟函数执…

os如何处理键盘的所有按键,显示or不显示,显示是如何显示

【0】README 0.1&#xff09; source code and text decription are from orange’s implemention of a os , and for complete code , please visit 我待会上传&#xff1b; 【1】 键盘输入缓冲区 step1&#xff09;缓冲区的数据结构如下&#xff1a; step2&#xff09;对…

Hibernate的缓存机制/会话级缓存机制

Hibernate 中维持了两级缓存。第一级缓存由 Session 实例维护&#xff0c;该缓存区保存着与该 Session 实例有关联的所有实体对象的数据&#xff0c;也称为内部缓存。而第二级缓存则存在于 SessionFactory 实例中&#xff0c;由通过该 SessionFactory 实例获取的所有 Session 实…

orm提取指定列_使用ORM提取数据很容易! 是吗?

orm提取指定列介绍 几乎所有系统都以某种方式与外部数据存储一起运行。 在大多数情况下&#xff0c;它是一个关系数据库&#xff0c;并且通常将数据获取委托给某些ORM实现。 ORM涵盖了很多例程&#xff0c;并且带来了一些新的抽象作为回报。 Martin Fowler写了一篇有关ORM的有…

如何编译文件(gcc + nasm)

【0】README 编译文件(nasm gcc)&#xff0c;特别是编译目标文件的依赖文件&#xff1b;本文旨在回顾 gcc 和 nams 编译器的编译命令&#xff0c;以及如果有多个依赖文件该如何编译&#xff1b; 【1】编译文件 1.1&#xff09;编译 lib/syscall.asm(lib/syscall.asm) nasm …

Hibernate中的Session.load() 和 Session.get() 的区别

文章目录相同点区别懒加载的问题执行语句 session.load(UserInfoBean.class,2) 会先在一级缓存中找 id2 的 UserInfoBean 对象&#xff08;看红色线条&#xff09;&#xff0c;找不到去二级缓存找&#xff0c;还找不到就不找了&#xff0c;直接获取一个代理对象并返回该对象。当…

python 分布式队列_〖Python〗-- Celery分布式任务队列

【Celery分布式任务队列】一、Celery介绍和基本使用Celery 是一个 基于python开发的分布式异步消息任务队列&#xff0c;通过它可以轻松的实现任务的异步处理&#xff0c; 如果你的业务场景中需要用到异步任务&#xff0c;就可以考虑使用celery&#xff0c; 举几个实例场景中可…

最大子序列和问题的解(共4种,层层推进)

【0】README 0.1&#xff09; source code and text description are from data structure and alg analysis &#xff1b; 0.2&#xff09; there are 4 methods solving maximum sum of subsequence&#xff0c; but the fourth proves to be the best one , the 3rd deser…

java设计模式代理模式_Java中的代理设计模式

java设计模式代理模式代理对象或代理对象为另一个对象提供占位符&#xff0c;以控制对该对象的访问。 代理充当原始对象的轻量级版本或简化版本。 它支持与原始对象相同的操作&#xff0c;但可以将那些请求委托给原始对象以实现它们。 代理设计模式是一种结构模式&#xff0c;…

Struts2参数值自动注入到JavaBean对象的属性中和JavaBean对象的属性值展示在页面中

文章目录参数值自动注入示例代码将JavaBean的属性值显示在页面上示例代码参数值自动注入 注意事项&#xff1a; 1.前端界面的表单项的参数命名格式为&#xff1a;Action属性名.JavaBean的属性名 2.Action的属性必须要有setter/getter方法&#xff0c;注入时会调用setter方法 …

ibmmq 通道命令_IBM MQ常用命令

常用命令创建队列管理器crtmqm –q QMgrName-q是指创建缺省的队列管理器删除队列管理器dltmqm QmgrName启动队列管理器strmqm QmgrName如果是启动默认的队列管理器&#xff0c;可以不带其名字停止队列管理器endmqm QmgrName 受控停止endmqm –i QmgrName 立即停止endmqm –p Qm…

算法运行时间中的对数

【0】README 0.1&#xff09; source code and text description are from data structure and alg analysis &#xff1b; 【1】分析算法最混乱的方面大概集中在对数上面&#xff0c; 除分治算法外&#xff0c;可将对数最常出现的规律概括为下列一般法则&#xff1a; 1.1&a…

java项目:永和大王项目_Java项目:书评

java项目:永和大王项目本文是关于这本书的 Peter Verhas撰写的Java Projects Second Edition 我去年写的 这样一篇文章的目的通常是为了促进这本书的销售。 在这种情况下没有什么不同&#xff0c;但是由于这是我写的书&#xff0c;而且我是撰写评论的人&#xff0c;因此赞美这…

Struts2+Hibernate项目中的时间和日期问题

文章目录数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期&#xff0c;而不展示时间日期控件日期时间数据展示问题日期时间数据存储问题场景一场景二场景三场景四数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期&#xff0c;而不展示时间 数…

把一个人的特点写具体作文_把一个人的特点写具体作文

把一个人的特点写具体作文在日常学习、工作抑或是生活中&#xff0c;大家都跟作文打过交道吧&#xff0c;写作文可以锻炼我们的独处习惯&#xff0c;让自己的心静下来&#xff0c;思考自己未来的方向。那要怎么写好作文呢&#xff1f;下面是小编为大家整理的把一个人的特点写具…

spring boot简介_Spring Boot简介

spring boot简介在本教程中&#xff0c;我们将看一下Spring Boot&#xff0c;看看它与Spring框架有何不同。 我们还将讨论Spring Boot提供的各种功能。 什么是Spring Boot&#xff1f; 在开发企业级应用程序时&#xff0c;Spring是一个功能强大的框架。 它为我们提供了诸如依赖…