动态扩展Java应用

摘要:你想写出无需改变源代码就可以进行扩展的程序吗?这篇文章介绍了如何使用interface和动态class载入来创建高扩展性的系统。从中你也可以学习到如何令其他的编程者和用户不需你的源代码,就可以对程序进行扩展。首先我们看一个没有使用interface和动态载入的简单例子,然后再讲述一个动态载入类的例子,这些类是由一个文件或者数据库的表格中读取的。

你曾经开发过一个要经常添加新功能的应用吗?在下面的例子中,市场部将会为每个顾客提供各种各样的价格处理。你的程序需要处理这些新的需求,你也必须让用户可以定制你的软件而无需改变源代码。

你可以做到避免修改现有的代码并且测试加入的新功能吗?你可以做到无需重新编译全部的东西来加入新的类吗?答案是可以的,你可能已经猜到了,就是使用interface和动态类载入。

要说明一下的是,为了说明方便,这里介绍的类和体系都是经过简化的。

什么是interface(接口)?

interface只是描述一个对象是如何被调用的。当你定义了一个接口,你就定义了其它的对象如何使用它。

对于大部分使用Java的人来说,你们可能已经知道接口是什么东西。但对于那些仍然不清楚的人,我将介绍一些基本的知识,然后创建一些复杂的例子。如果你已经很清楚接口的知识,你可以直接跳到“使用字符串来指定类名字”的部分。

接口的威力

以下的例子说明了接口的威力。假定你的客户是搞经纪的,他们想让你建立一个交易的系统。他们的交易是各种各样的:包括有股票、债券和日用品等等。不同客户的交易数量也是不一样的,该数量由客户称为pricing plans的东东来定义。

你首先考虑类的设计。主要的类和它们的属性由客户来定义,可以是:

Customer(顾客):Name(名字),Address(地址),Phone(电话)和PricingPlan

Trade(交易):TradeType(股票、债券或者日用品),ItemTraded(股票的记号)、NumberOfItemsTraded, ItemPrice, CommissionAmount

PricingPlan:通过一个过程的调用来计算该交易的CommissionAmount

不使用interface的编码

开始编码时你可以不使用接口,然后再由该代码增强其功能。现在,该客户有两个标价计划定义如下:

计划1:对于常规的顾客,$20/交易

计划2:一个月中的前10个交易,$15/交易,以后的 $10/交易

Trade对象使用一个PricingPlan对象来计算要收顾客多少佣金。你为每个标价计划都创建了一个PricingPlan类。对于计划1,该类称为PricingPlan20,而计划2的类则称为PricingPlan1510。两个类都通过一个称为CalcCommission()的过程来计算佣金。代码如下所示:

类名: PricingPlan20

public double calculateCommission( Trade trade )
{
  return 20.0;
}
类名: PricingPlan1510
public double calculateCommission( Trade trade )
{
  double commission = 0.0;
  if( trade.getCustomer().getNumberOfTradesThisMonth() <= 10 )
    commission = 15.0;
  else
    commission = 10.0;
  return commission;
}

时间: 2025-01-30 14:57:00

动态扩展Java应用的相关文章

动态编译JAVA程序

编译|程序|动态 在Sun JDK 1.2及后续版本中,包含了一组可在程序运行时刻编译和执行Java代码的API.这些API被包含在tools.jar类库中.这个功能允许Java程序在运行时动态编译.执行小的代码块,在有些情况下这个功能会让Java应用程序的架构更加灵活.开放. 本文假定读者已经在计算机中安装并配置好了Sun JDK 1.2或更高的版本,并对javac编译器命令有所了解. 在Java程序中使用编译器 假定要使用javac命令编译 /home/mytest目录下Test.java文

ArrayList的动态扩展

ArrayList相比较Array来说,具有的优势是可以动态扩展,即它所包含的成员 个数是不确定的,可以随着不断地添加,或者移除进行扩展.但我们一定要知道 的是,ArrayList是基于Array(数组)的,我们来看一下它的构造函数 其实这个Items是一个object的数组.这也从另外一方面说明了ArrayList是基 于Object的,所以无法避免装箱和拆箱操作.这与泛型的List是不一样的

使用native方法扩展Java程序的功能详解

Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能. 可以将native方法比作Java程序同C程序的接口,其实现步骤: 1.在Java中声明native()方法,然后编译: 2.用javah产生一个.h文件: 3.写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件): 4.将第三步的.cp

可动态扩展的数据库模型设计

在通常的数据库设计中,我们定义了每个实体有多少个属性,每个属性的数据类型是什么,有多长,是否允许为空,有什么约束条件等,这些定义是完全静态的,系统创建时就全部定义好,不能动态修改.但是对于实体的属性变化很快,或者实体和属性由用户在系统中自行定义的情况下,那么就需要一个可以动态扩展的数据库模型,以保存各种动态产生的数据. 比如我们要做一个电子商务网站,需要建立一个商品表以保存各种要卖出的商品的属性.但是商品的属性各种各样,不同类别的商品在属性上千差万别,不可能建立一个静态的商品表来存储所有的属性.

docker调整rootfs分区大小及动态扩展容器空间

调整docker中rootfs的分区大小 这里主要介绍的调整Container内rootfs的大小,rootfs默认的是10G,我们可以通过下面的方法增大该大小.     bash-4.1# df -lhT    Filesystem Type Size Used Avail Use% Mounted on    rootfs rootfs 9.8G 1.4G 7.9G 15% /    tmpfs tmpfs 921M 0 921M 0% /dev    shm tmpfs 64M 0 64M

linux中docker动态扩展容器空间大小

今天同事要在docker的jenkins容器里安装sdk,当他把他之前安装好的sdk传我时,我才发现居然有16g,docker的容器整个都才只有10个g,还好让我找到个可以动态扩展docker容器的文章,先分享给大家.   系统:centos 6(64位)   docker版本:1.7.1   docker存储引擎:devicemapper   宿主机分区格式必须是:ext2.ext3.ext4 脚本内容: #!/bin/bash #This script is dynamic modify d

JQuery 动态扩展对象之另类视角_jquery

例如:有一个employee对象, 复制代码 代码如下: function employee(){ this.e_id = 0; this.e_name = ""; } 现在需要为它动态的新增"age"属性和"toString()"方法, 复制代码 代码如下: var empObj = new employee(); empObj["age"] = 20; empObj["toString"] = func

使用xsl来动态生成java代码

动态 xsl本身就是一个构型良好的xml,它能够把一个xml文档转换成另外一个xml文档,或者转换成文本文件.html文件等等.这里就是利用xsl来动态的生成我们想要的java文件(从某种角度看,java代码其实也就是一个文本文件),希望能够通过这篇文章,看到xml以及相关的技术所具有的强大能力! 这里首先给一个xml例子,我们将通过一个xsl从该xml文件中抽取有用的信息来生成java代码(实际上是一个javabean): 以下内容为程序代码<?xml version="1.0"

Ajax技术:构建动态的Java应用程序

ajax|程序|动态 [导读]在本文中,作者Philip McCarthy介绍了通过后台通道的方法来创建动态Web应用的经验. Ajax(Asynchronous JavaScript and XML)是一个结合了Java技术.XML.以及JavaScript的编程技术,可以让你构建基于Java技术的Web应用,并打破了使用页面重载的惯例. Ajax,异步JavaScript与XML,是使用客户端脚本与Web服务器交换数据的Web应用开发方法.这样,Web页面不用打断交互流程进行重新加裁,就可以