简易测量系统的开发容器思想是,定义一个measure接口,方便用户对于测量方法的扩展,和一个container用于储存将要测量的对象。基于测量方法和测量对象的不确定,所以在接口中和container类中的方法参数都使用Object父类,易于系统的扩展和更好的满足实用性。
(一)接口measure代码如下:
//放入com.yc.measuresys的包中
package com.yc.measuresys;
public interface Measure{
public double measure(Object obj);
}
(二)container类:
package com.yc.measuresys;
public class Container {
private Object max;
private Object min;
private double avg;
private int total;
private int sum;
private Object[] objs=new Object[100];
private Measure measure;
//空构造方法
public Container(){}
//一个参数的构造方法
public Container(Measure measure){
this.measure=measure;
}
//对container类的清空操作
public void clear(){
max=null;
min=null;
avg=0;
total=0;
sum=0;
objs=new Object[100];
measure=null;
}
//重新对measure赋值
public void setMeasure(Measure measure){
this.measure=measure;
}
//加入一个新的数据
public void add(Object obj){
if(obj==null){
System.out.println("测量的对象不能为空");
return;
}
if(this.measure==null){
System.out.println("测量方法不能为空");
return;
}
double value=this.measure.measure(obj);
if(total==0){
max=obj;
min=obj;
}else{
double maxvalue=this.measure.measure(max);
double minvalue=this.measure.measure(min);
if(minvalue>value){
min=obj;
}else if(maxvalue
}
}
objs[total]=obj;
total++;
sum+=value;
avg=sum/total;
}
//当加入的元素个数超过数组的长度时,扩充数组的长度为原来的两倍
public void enlarge(){
if(total>objs.length){
//创建一个新数组,长度为原数组的两倍
Object[] newarray=new Object[objs.length*2];
//库函数System.arraycopy完成数组的复制
System.arraycopy(objs,0,newarray,0,objs.length );
//将新数组的引用地址指向原数组
objs=newarray;
}
}
//获取最大元素
public Object getMax(){
return max;
}
//获取最小元素
public Object getMin(){
return min;
}
//获取平均数
public double getAvg(){
return avg;
}
//获取总的数据个数
public int getTotal(){
return total;
}
//获取所有数据和
public double getSum(){
return sum;
}
//获取数组中的每个元素
public Object[] getObject(){
Object[] newobjs=new Object[objs.length];
System.arraycopy(objs,0,newobjs,0,objs.length);
objs=newobjs;
return objs;
}
}
这样设计系统就能拥有很好的扩展性,通过创建测量对象和测量方法,可以重复使用这个系统,比如,在下面的测试中,写了两个测量人体bmi指数的类:
(一)Person类:
//这个类放在com.tencent.bean中
package com.tencent.bean;
public class Person{
private String name;
private int weight;
private double height;
//空的构造方法
public Person(){}
//三个参数的构造方法
public Person(String name,int weight,double height){
this.name=name;
this.weight=weight;
this.height=height;
}
//获取weight属性的方法
public int getWeight(){
return this.weight;
}
//获取height属性的方法
public double getHeight(){
return this.height;
}
//获取Person属性信息的方法
public String getInfo(){
return "名字:"+this.name+"\t体重:"+this.weight+"\t身高"+this.height;
}
}
(二)Bmimeasure类
package com.tencent.bean;
import com.yc.measuresys.Measure;
import com.tencent.bean.Person;
public class Bmimeasure implements Measure{
public double measure(Object obj){
if(obj==null){
System.out.println("测量对象不能为空");
}
if(!(obj instanceof Person)){
System.out.println("传入的对象必须是人");
}
Person p=(Person)obj;
int weight=p.getWeight();
double height=p.getHeight();
return weight*weight/height;
}
}
通过Test.java文件进行测试:
//导入外部的包
import com.yc.measuresys.Measure;
import com.yc.measuresys.Container;
import com.tencent.bean.Person;
import com.tencent.bean.Bmimeasure;
public class Test{
public static void main(String[] args){
//直接调用节省了3个变量名空间
Measure measure=new Bmimeasure();
Container con=new Container(measure);
con.add(new Person("smith",60,170));
con.add(new Person("Tom",80,180));
con.add(new Person("Jack",90,150));
Person maxPerson=(Person)con.getMax();
Person minPerson=(Person)con.getMin();
System.out.println(maxPerson.getInfo() );
System.out.println(minPerson.getInfo() );
}
}
可以得到bmi最大和最小的人,以及平均bmi指数、传入的总人数、总bmi指数、传入的每个人的数据信息,以后如果再要用到这个系统时,只需要重写measure方法和创建一个数据类即可。