可扩展的Java应用程序开发模式-Java基础-Java-编程开发

响应式编程在Java中的实现 响应式编程是一种编程范式,它关注于数据流和变化的传播,旨在构建能够更好地处理异步数据流的应用程序。Java作为一门广泛使用的编程语言,通过Reactor和RxJava等库,提供了响应式编程的实现。本文将介绍响应式编程的概念,并展示如何在Java中使用Reactor和RxJava实现响应式编程。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

  现在很多JAVA书籍,在介绍SWING的事件模型时,为了使JAVA初学者容易理解和上手,通常是在主类(自己的JFrame子类或JPanel)中做所有事情:要么由主类作为监听器,在接口的方法中通过判定事件源来决定具体做何事;要么在主类中使用内隐类来实现监听器,(因为内隐类可以方便的访问主类中的成员变量)。而很多JAVA初学者在往后的编程中也采用这种模式(至少我以前是这样的)。其实,这种做法虽然简单,却缺乏可读性、可扩展性和可维护性。之前我看到了一篇关于这个问题的文章(来自于《JavaPro》),现整理出来与大家分享。

  下面我将用一个简单的例子来说明如何使用模式来解决这个问题。

  现在,假设我们要编写一个使用几个单选按钮从一个长列表中选择不同分组的程序,就象下图中看到的。单击Female单选按钮时,只有女孩的名字被显示;当你点击Male按钮时,程序显示男孩的名字。

  这个程序最简单的版本是在主类中做每件事情,主类包含一些持有孩子姓名的数组和向量(Vector),一个另一个最简单的方法是为每个孩子创建一个对象,每个对象有一个象isFemal()这样的方法来帮助我们确定要显示的是男的还是女的。在程序中我们把每个孩子的类称为Swimmer:

public class Swimmer{
 private String name;
 private int age;
 private String club;
 private boolean female;

 public Swimmer(String name,int age,String club,boolean female){
  this.name=name;
  this.age=age;
  this.club=club;
  this.female=female;
 }

 public boolean isFemale(){
  return female;
 }

 public String getName(){
  return name;
 }

 public int getAge(){
  return age;
 }

 public String getClub(){
  return club;
 }
}
  下一步我们要做的是决定整个列表中的哪些孩子会被显示。我们可以在主用户接口类中做到这点,但是最好的是在一个叫做Swimmers的集合类中来做,这个类有一个getList()方法,它带有布尔型的参数来决定是男孩还是女孩:
//get a vector of swimmers who are (female)
public Vector getList(boolean female){
 Vector v=new Vector();
 for(int i=0;i   Swimmer swm=(Swimmer)kids.elementAt(i);
  if(swm.isFemal()==female) v.add(swm);
 }
 return v;
}
  我们又提供了一个不带参数的多态getList()方法来返回整个列表。

  现在让我们进入程序中的第一个重要的部分,为了显示这些孩子的姓名,我们需要为三个单选按钮都添加一个事件监听器,使得每个都能显示出正确的孩子们:
public void actionPerformed(ActionEvent e){
 //listen for button clicks and do the right thing
 Object obj=e.getSource();
 if(obj==female) loadFemales();
 if(obj==male) loadMales();
 if(obj==both) loadBoth();
}

private void loadFemales(){
 //display female swimmers
 Vector v=swimmers.getList(true);
 loadList(v);
}

private void loadMales(){
 //display male swimmers
 Vector v=swimmers.getList(false);
 loadList(v);
}
  尽管这个方法在简单、小型的情况下工作得很好,但是它没有良好的可扩展性。如果你有10个按钮,扩展actionPerformed()方法来测试每个按钮和调用某些对应的操作,会使得可读性非常差。相反,我们最好在包含用户接口的类中去掉所有的判定。

  做到这点的一个途径是使用Command模式。当我们使用这个模式的时候,需要我们创立一个Command接口:
//the Command interface
public interface Command{
 public void execute();
}
  我们将三个单选按钮扩展成特定的带有Command接口的类,我们就可以把对命令的执行从JFrame类转移到每个按钮的类。同时,我们创建一个叫做SexButton的基类,并将ActionListener代码移到基类中,这样就不需要分别在每个按钮中添加事件监听器:
//abstract radio button class
public abstract class SexButton
extends JRadioButton implements Command{
 protected Swimmers simmers;
 //JawList is a subclass of JScrollPane contained a JList;
 protected JawList kidList;

 public SexButton(String title,Swimmers sw,
 JawList klist,ActionListener al){
  super(title);
  swimmers=sw;
  kidList=klist;
  addActionListener(al);
 }

 //abstract execute method
 public abstract void execute();
}
  注意这个类必须被扩展以使得它有用,因为我们没有具体化execute()方法。这个基本的抽象按钮类只是我们从中导出的具体类的一个模板,这实际也是模板设计模式的一个简单例子。
//radio button to select female swimmers
public class FemaleButton extends SexButton{
 public execute(){
  Vector v=swimmers.getList(true);
  loadList(v);
 }

 private void loadList(Vector v){
  kidList.clear();
  for(int i=0;i    Swimmer swm=(Swimmer)v.elementAt(i);
   kidList.add(swm.getName());
  }
 }
}
  现在,来看一下我们完成的工作。所有的按钮都成为了Command按钮了,actionPerformed()方法也简化成下面这样简单的方法:
public void actionPerformed(ActionEvent e){
 Command cmd=(Command)e.getSource();
 cmd.execute();
}
  正如你看到的,这更加简单而且完全是可扩展的。

[1] [2]

如何使用Java和Hibernate进行Java持久化应用程序开发 作者:禅与计算机程序设计艺术 《48.《如何使用Java和Hibernate进行Java持久化应用程序开发》 48.如何使用Java和Hibernate进行Java持久化应用程序开发》 ##1. 引言 ##1.1. 背景介绍 Java 是一种广泛应用的编程语言,Hibernate 是 阅读详情

相关推荐

Java编程案例开发实战指南

自定义异常类是在标准异常类无法满足需求时,我们通过继承Exception或其子类来创建的。自定义异常类需要指定父类,可以加入额外的构造方法,以及可能的成员变量和方法来传递异常详情。

weixin_42605397的博客 1200

Java扩展算法和辅助工具

获取权限文件 Sun在其下载页面(http://www.oracle.com/technetwork/java/javase/downloads/index.html)提供了权限文件的下载地址,对应Java 7 和 Java 6 打开压缩包local_policy.jar和US_export_policy.jar是此次配置中用到的文件 配置权限文件 需要在JDK的JRE环境中,或者

danwell7的专栏 9473

新手必看:SMIC 0.18um PDK安装保姆级教程(附Cadence IC617环境配置)

本文提供SMIC 0.18um PDK在Cadence IC617环境下的详细安装教程,涵盖环境准备、文件解压、安装脚本运行、环境变量配置及Cadence集成验证等关键步骤,特别针对初学者常见问题提供解决方案,助力快速掌握芯片设计工具配置。

weixin_30522183的博客 495

在java中使用SPI创建可扩展的应用程序

什么是可扩展的应用程序呢?可扩展的意思是不需要修改原始代码,就可以扩展应用程序的功能。我们将应用程序做成插件或者模块。 这样可以在不修改原应用的基础上,对系统功能进行升级或者定制化。 本文将会向大家介绍如何通过java中的SPI机制实现这种可扩展的应用程序。

程序那些事 2万+

R语言maftools包实战:5分钟搞定TCGA癌症突变数据可视化(附完整代码)

本文详细介绍了如何使用R语言的maftools包快速解析和可视化TCGA癌症突变数据。通过实战演示,从环境搭建、数据导入到核心可视化(如瀑布图、棒棒糖图)和深度统计分析(如生存分析、突变特征),帮助生物信息学研究者高效完成癌症基因组学分析,大幅提升从原始MAF数据到发表级图表的效率。

weixin_29054399的博客 189

解放双手:用KUKA示教器白键一键触发复杂工艺,自定义你的快捷指令

本文详细介绍了如何利用KUKA示教器的工艺白键功能,通过自定义快捷指令一键触发复杂工艺,显著提升自动化产线效率。文章涵盖UserTech技术栈解析、KRL脚本封装、人机交互视觉工程及工业实战策略,帮助工程师实现机械臂操作的高阶优化。

weixin_30379531的博客 432

Java开发模式演化

Java开发模式的演化历程,讲解每个阶段的关键特征与代表性框架。

黄金屋颜如玉 436

YOLOv13必学核心:SKAttention选择性核注意力机制原理 + 实战全拆解

SKAttention的核心思想来源于人类视觉系统的一个重要特性:根据不同的视觉刺激,人眼能够自适应地调整感受野大小。SKAttention将这一生物学原理转化为深度学习中的注意力机制,通过动态选择和融合不同大小的卷积核,实现了自适应的多尺度特征提取。在人类视觉皮层中,不同的神经元具有不同大小的感受野,而且这些感受野的大小会根据视觉刺激的类型动态调整。本文将深入解析SKAttention模块的设计原理、数学基础、实现细节,以及其在YOLOv13目标检测框架中的集成应用,为读者提供全面而深入的技术理解。

FJN110的博客 97

Java 应用程序开发的最佳实践:性能、可扩展性和可维护性

Java 生态系统中提供了大量的库、框架和工具,为开发人员提供了丰富的资源来构建在性能、可扩展性和可维护性方面脱颖而出的应用程序。Java 应用程序的整体成功和质量很大程度上受到模块化代码组织、性能优化、可扩展性和并发保证、强大的错误处理和日志记录实现以及对测试和文档的重视的影响。通过适当的异常管理来维护应用程序的稳定性和弹性,其中包括捕获某些异常并提供信息丰富的错误消息。Java 应用程序的可维护性在很大程度上取决于清晰和完整的文档。关注我的博客,您将在其中获得提示、技巧和挑战,以保持您的技能敏锐。

我的博客,不一样的自我表达 1332

Unlocking Decoding-time Controllability: Gradient-FreeMulti-Objective Alignment with Contrastive Pr

将基于庞大网络语料库训练的大型语言模型(LLMs)(OpenAI,2023;Touvron 等,2023;Google,2023)与人类偏好对齐,是减少产生不安全(Wei 等,2023)、幻觉(Zhang 等,2023b)和有偏见(Gallegos 等,2023)内容的重要一步。随着偏好学习技术(如 PPO(Schulman 等,2017)、DPO(Rafailov 等,2023)及其他变体(Azar 等,2023;Ethayarajh 等,2024;

qq_52053775的博客 1169

OpenCV实例(一)人脸检测

计算机视觉使很多任务成为现实,其中两项任务就是人脸检测(在图像中定位人脸)和人脸识别(将人脸识别为特定的人)。OpenCV实现了一些人脸检测和识别的算法。从安全到娱乐,这些技术在现实环境中都有应用。介绍OpenCV的一些人脸检测和识别功能,并定义特定类型的可跟踪物体的数据文件。具体来说,将研究Haar级联分类器,通过分析相邻图像区域之间的对比度,确定给定图像或子图像是否与已知类型匹配。

小幽余生不加糖 5005

如何创建可扩展的Java应用程序

开放的扩展使许多应用程序受益。 这篇文章描述了两种在Java中实现这种可扩展性的方法。 可扩展的应用 可扩展应用程序是可以扩展其功能而不必重新编译它们 ,有时甚至不必重新启动它们的应用程序。 只需将jar添加到类路径中,或通过更复杂的安装过程来实现。 Eclipse IDE是可扩展应用程序的一个示例。 它允许安装称为插件的扩展,以便可以使用新功能。 例如,您可以安装源代码管理(SC...

最佳 Java 编程 627

让 IF 更好读:在 ABAP 里尽量使用正向条件的实战指南

摘要:SAP系统开发中,代码可读性与可维护性的关键往往在于条件判断的写法。Clean ABAP风格指南建议尽量采用正向表达的条件判断,如使用has_entries = abap_true而非否定式写法。正向表达能降低理解成本,避免"否定的否定"带来的逻辑混乱,但不应为追求正向而制造空分支。在团队协作中,正向条件更利于代码评审和测试覆盖,建议通过工具检查和智能评审确保规范执行。落地时可关注变量命名正向化、避免空分支、主流程清晰展开等要点,以提升长期维护效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

java中mvc开发模式_MVC开发模式

1.1 MVC模式1.1.1 MVC模式简介MVC是一种架构型模式,它本身并不引入新的功能,只是用来指导我们改善应用程序的架构,使得应用的模型和视图相分离,从而得到更好的开发和维护效率。在MVC模式中,应用程序被划分成了模型(Model)、视图(View)和控制器(Controller)三个部分。其中,模型部分包含了应用程序的业务逻辑和业务数据;视图部分封装了应用程序的输出形式,也就是通常所说...

weixin_29631169的博客 717

计算机组成原理(第三版)唐朔飞-第十章控制单元的设计-课后习题

计算机组成原理(第三版)唐朔飞-第十章控制单元的设计-课后习题

weixin_45735391的博客 3万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java有几种开发模式_javaweb的几种开发模式

1、MVC模式基础1.1、MVC模式简介MVC是一种架构型模式,它本身并不引入新的功能,只是用来指导我们改善应用程序的架构,使得应用的模型和视图相分离,从而达到更好的开发和维护效率。在MVC模式中,应用程序被划分成模型(Model)、视图(View)和控制器(Controller)三个部分。其中,模型部分包含了应用程序的业务逻辑和业务数据;视图部分封装了应用程序的输出形式(页面、界面);而控制器部...

weixin_28733933的博客 1018

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JavaWeb开发模式

一、概述 从互联网诞生的第一天起,web从一个简单的静态页面,发展到今天五花八门、令人眼花缭乱的复杂应用,大到企业级的web应用系统,小到简单的SPA管理系统。在硬件性能提升的同时,通过各种技术实现了海量数据存储、解决了高并发的性能瓶颈、追求极致的用户体验等。从前端到后端,随着业务需求的变更和技术的更新迭代,开发模式也随之发生着改变。 二、原则 从软件工程的层面来看,开发一个系统,不仅是为了...

yidu_tao的博客 752

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

4.Java Web开发模式(javaBean+servlet+MVC)

MVC是英文“Model-View-Controller”的缩写,最初是在Smalltalk-80中被用来构建用户界面的。其中M代表模型Model,V代表视图View,C代表控制器Controller。通过模型视图控制器来采用MVC模式的目的,就是为了增加代码的重用率,减少数据表达、数据描述和提高应用操作的偶合度。同时也使得软件的可维护性、可修复性、可扩展性、灵活性以及封装性大大提高。

m0_61086522的博客 1347

JSP开发模式

JSP开发模式 为了更好的利用 JSP 来开发 Web 应用程序,下面介绍两种 JSP 开发模式。JSP + JavaBean 模式和Servlet + JSP + JavaBean 模式 JSP + JavaBean 模式 这一模式中 JSP 页面负责处理请求和输出响应结果,并将其中发生的一些业务逻辑交给JavaBean 处理。最大的特点是将一次请求的响应过程完全交给一个

515

java se平台的应用程序_使用 Java 平台创建可扩展应用程序

本文将介绍使用可扩展服务创建应用程序的两种方法,任何人都可以在无需修改原始应用程序的情况下提供服务实现。通过设计一个可扩展的应用程序,我们可以轻松地升级或增强产品的特定部分,同时无需修改核心应用程序。 可扩展应用程序的一个例子是文字处理程序本文将介绍使用可扩展服务创建应用程序的两种方法,任何人都可以在无需修改原始应用程序的情况下提供服务实现。通过设计一个可扩展的应用程序,我们可以轻松地升级或增强产...

weixin_42297519的博客 206

Java 学习路线全解析:从基础到实战,全面掌握 Java 编程

在当今数字化时代,Java 作为一种广泛应用且极具影响力的编程语言,为众多开发者开启了通往技术世界的大门。无论是大型企业级应用开发,还是互联网后端服务构建,Java 都展现出了强大的适应性和稳定性。以下是一条系统全面的 Java 学习路线,帮助你逐步攀登 Java 编程的高峰。

ZIM的博客 2972

java spi机制_在java中使用SPI创建可扩展的应用程序

简介什么是可扩展的应用程序呢?可扩展的意思是不需要修改原始代码,就可以扩展应用程序的功能。我们将应用程序做成插件或者模块。这样可以在不修改原应用的基础上,对系统功能进行升级或者定制化。本文将会向大家介绍如何通过java中的SPI机制实现这种可扩展的应用程序。SPI简介SPI的全称是Java Service Provider Interface。是java提供的一种服务发现的机制。通过遵循相应的规则...

weixin_39981624的博客 73

java开发windows应用_还有用Java开发应用程序的必要吗?

Java是一种通用语言,它遵循面向对象的编程风格,采用Write-Once-Run-Anywhere的方法进行开发。它有专为具有互联网功能的设备的接口而设计,在过去的20年中,这种特殊的设计选择确保了Java在开发人员社区中的紧密关联性。如今的2019年,Java已无处不在,并且经常被用于在任何地方和每个平台上进行开发:从智能手机Android设备到网站,视频游戏,汽车甚至物联网设备。在...

weixin_39796839的博客 549

两种开发模式的区别和思考

💻 你使用的是哪个模式

日常开发分享 1059

Spring Boot 插件化开发模式

比如大家熟悉的jdbc中的Driver接口,不同的厂商可以提供不同的实现,有mysql的,也有oracle的,而Java的SPI机制就可以为某个接口寻找服务的实现。插件化开发模式正在很多编程语言或技术框架中得以广泛的应用实践,比如大家熟悉的jenkins,docker可视化管理平台rancher,以及日常编码使用的编辑器idea,vscode等,随处可见的带有热插拔功能的插件,让系统像插了翅膀一样,大大提升了系统的扩展性和伸缩性,也拓展了系统整体的使用价值,那么为什么要使用插件呢?为什么会出现这个效果呢?

m0_73735578的博客 1007
上一篇: Java实现类MSN、QQ好友上线通知界面-Java基础-Java-编程开发
下一篇: JBuilder2005实现重构之升级到JDK5.0-Java基础-Java-编程开发
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值