多年来, 使用Plumbr进行性能监视时,我遇到了数百个资源泄漏引起的性能问题。 在这篇文章中,我想描述一种最简单的方法来清理资源并避免该问题。

首先,我以电影播放器​​应用程序为例来描述问题。 这种应用程序的主要功能自然是在播放电影本身。 按照当今的习惯,我们不想将整个电影收藏存储在用于播放电影的设备上。 相反,我们将电影下载到本地临时文件中,然后播放并删除该文件以释放下一部电影的空间。 这种工作流程的简单实施如下所示:

public class MoviePlayer {private final Catalog catalog = new Catalog();public void play(String movieName, String screen) {Movie movie = catalog.find(movieName);try {movie.fetch();movie.play(screen);} finally {movie.release();}}
}class Catalog {Movie find(String name) {return new Movie(name);}
}

如您所见, MoviePlayer类是Catalog类的客户端,必须照顾电影播放的整个生命周期。 查找,下载,播放和删除文件均属于MoviePlayer类的实现。

这是第一个问题:如果至少一个这样的客户端是由某个粗心的开发人员编写的,他们忘记调用movie.release()方法,则下载的文件将保留在本地磁盘上。 因此,您播放的每部电影都将添加一个文件,并且设备上的磁盘空间最终将被耗尽。

引入其他功能后,就会暴露出这种“万事通”代码的第二个问题。 例如,假设您需要增加记录实际电影播放时间的可能性。

当前唯一的方法是更改MoviePlayer类。 如果Catalog类有其他客户,则每个客户都需要引入更改。 结果, MoviePlayer的每个附加功能都变得越来越大,处理越来越多的独立问题。 结果,代码最终将难以理解和更改。

考虑到MoviePlayer应该主要只是处理电影的播放,所以听起来确实有太多额外的麻烦。 确实,因此让我们尝试将所有这些混乱的内容从MoviePlayer中移出,以确保我们拥有一个负责任的班级。 命令设计模式是20年的技术,最适合手头的任务。

减轻痛苦:救援的命令模式


该方法背后的基本思想是首先抽象出因使用案例而异的操作,以使其与算法中更稳定的部分区分开。 在我们的情况下,这可能涉及电影播放或使用不同的视频编解码器进行重新编码。 因此,包括“查找电影-下载-执行某些操作-删除本地文件”的乏味步骤的样板将与特定用例隔离。 在我们的示例中,我们可以使用以下简单界面执行此操作:

interface MovieCommand {void execute(Movie movie);
}

上面的更改包括引入一种带有MovieAction类型的附加参数的新方法。 在此方法中,将执行整个算法:

  • 电影已找到。
  • 电影已下载。
  • 传递给该方法的动作或命令在影片上执行。 现在,特定操作是随用例而变化的唯一可变部分。
  • 最后,释放电影的文件句柄并执行对临时文件的清理。

现在,如果需要以任何方式更改算法,我们将只在一个地方进行操作,而不会影响仍仅关注其特定动作(例如电影播放或编码)的任何客户端。 现在,我们的MoviePlayer示例非常简单:

class Catalog {private Movie find(String name) {return new Movie(name);}void withMovie(String movieName, MovieCommand action) {Movie movie = find(movieName);try {movie.fetch();action.execute(movie);} finally {movie.release();}}
}

该技术非常强大且广泛。 如果您尚未意识到此用途,请考虑对关系数据库的JDBC访问。 所有与获取数据库连接,准备语句,获取结果集以及关闭资源有关的样板文件,特别是在Spring Templating进行救援之前,都是噩梦般的处理顺序。

同样,可以通过使用命令模式,从不必要的样板中清除代码并大大简化代码库,在自定义代码库中实现不同方面,例如安全检查或缓存。

翻译自: https://www.javacodegeeks.com/2016/09/resource-leakages-command-pattern-rescue.html

资源泄漏:救援的命令模式相关推荐

  1. 单例模式引发的内存泄漏:_资源泄漏:救援的命令模式

    单例模式引发的内存泄漏: 多年来, 使用Plumbr进行性能监控时,我遇到了数百个资源泄漏引起的性能问题. 在这篇文章中,我想描述一种最简单的方法来清理资源并避免该问题. 首先,我以电影播放器​​应用 ...

  2. 命令模式在开源代码中的应用

    命令模式的作用:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开. 案例 JDK 中的线程 java.lang.Thread,使用了命令模式. Thread 类的构造方法可以接收实现 ...

  3. 命令模式的优点?_一篇目录复习完设计模式

    设计模式分类: 创建型设计模式 创建型设计模式的主要关注点是"怎样创建对象?",它的主要特点是"将对象的创建与使用分离".这样可以降低系统的耦合度,使用者不需要 ...

  4. linux怎么配置命令模式,Linux几种命令模式

    原标题:Linux几种命令模式 必须掌握的几个Linux命令 我们为什么要学习Linux的命令? 初学者上手Linux系统会很懵.不管你是否安装了图形化界面,或者去网上找一些教程.或者一些Linux的 ...

  5. 举例说,在命令模式(Command Pattern)

    在前面加上 谈到命令,大部分的人脑海中会想到以下这幅画面   这在现实生活中是一副讽刺漫画,做决定的人不清楚运行决定的人有何特点,瞎指挥.外行领导内行说的就是这样的.只是在软件设计领域,我们显然要为这 ...

  6. IOS设计模式之四(备忘录模式,命令模式)

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

  7. PHP面向对象处理请求,PHP面向对象之命令模式

    PHP面向对象之命令模式,这个模式主要由 命令类.用户请求数据类.业务逻辑类.命令类工厂类及调用类构成,各个类的作用概括如下: 1.命令类:调用用户请求数据类和业务逻辑类: 2.用户请求数据类:获取用 ...

  8. [命令模式]在游戏开发中的应用

    设计模式中的每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复劳动. 一个设计模式,它的服务对象是高层模块,在设计模式中称为客 ...

  9. 使用NMT和pmap解决JVM资源泄漏问题

    NMT NMT是Native Memory Tracking的缩写,一个JDK自带的小工具,用来跟踪JVM本地内存分配情况(本地内存指的是non-heap,例如JVM在运行时需要分配一些辅助数据结构用 ...

最新文章

  1. 字节跳动教育业务怎么样_[财经]字节跳动教育品牌叫什么名字?大力教育怎么样? - 南方财富网...
  2. python读取文件第n行-python读取文件第n行
  3. 第3周 区_SQL Server中管理空间的基本单位
  4. MFC 使用datetimepicker获取时间
  5. sougou输入法安装
  6. iis url重写 域名跳转子目录_逐浪CMS小哥整理IIS设置URL重写,实现页面的跳转的重定向方法...
  7. 江苏联合阿里云启动“1+30+300”工程 制造业大省欲打造智造模板
  8. Nginx反向代理之proxy_set_header指令
  9. linux无线网卡消失,linux下wpa/wpa2的无线网卡设置 [暂时还没有证实是否能用]
  10. linux中可以安装不同版本的gcc么,在linux下安装多个版本的GCC
  11. 从语音识别到语义识别还有多少路要走?
  12. 每周收获(11-13)
  13. codevs——2822 爱在心中
  14. 清华大学《走进心理学》2021春学堂在线参考答案
  15. html5通讯录源码,通讯录web版
  16. 数据分析进阶 - 评分模型权重计算方法
  17. 【系统】ThrottleStop软件使用教程入门级,游戏+工作两种解决cpu过热方案
  18. 2020 前端必看 20个最好的前端Web开发工具
  19. Python 技术篇 - whl库安装,有没有amd64结尾的区别
  20. 用Matlab的.m脚本文件处理实验室数据

热门文章

  1. 跟我学 Java 8 新特性之 Stream 流(二)关键知识点
  2. 从0部署一个动态网站
  3. 使用jdbc连接mysql数据库代码示例
  4. Nodejs第一讲记录
  5. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——struts.xml配置详情
  6. 银行营业网点管理系统——entity类(CityArea)
  7. LocalDateTime与LocalDate之间的相互转换
  8. php 常用的日期函数,常用php日期函数总结
  9. 脚本可以放在html外,关于把script脚本放在html结束标签外的运行结果???
  10. java联接pg库_Java14:使用Java 14的新记录联接数据库表