• 一种B/S模式下基于JAVA反射机制的可伸缩动态加载模块的解决方案


    源代码下载(Jcreator工程)

    项目需求:

    项目主体采用B/S架构,在逻辑层需要用到不同形式的数据(分别可能从数据库或者配置文件进行读取所需数据),进而进行数据的业务计算,得出结果。

    实际项目中,模型的设计是不同的部门或者单位进行设计,但是主运行框架,现设计一试用方案如下:

    其中详细的模块说明已经给予注释,测试框架列表如下:

    该设计中涉及到三个接口,分别为:ICalculateModule,IDataProvider,IModuleValid;

    CalculateModule:负责进行整个嵌入模块的计算任务,定义了计算函数等;

    IDataProvider:接口定义计算模块所需数据的提供方式;

    IModuleValid:提供相关的校验工作,例如模块有效性校验,规范性校验,数据校验等等;

    接口定义代码如下:

    接口ICalculateModule 

    /**
     * @(#)ICalculateModule.java
     *
     *
     * 
    @author wm is wei&mei
     * 
    @version 1.00 2011/10/24
     
    */
    package com.hw.wm.calculate;

    public interface ICalculateModule {
        int getResult();
    }

    接口IDataProvider

    /**
     * @(#)IDataProvider.java
     *
     *
     * 
    @author wm is wei&mei
     * 
    @version 1.00 2011/10/24
     
    */
    package com.hw.wm.data;

    public interface IDataProvider {
        int getDataA();
        
        int getDataB();
        
    }

    抽象类ACalculateModule: 

    /**
     * @(#)ACalculateModule.java
     *
     *
     * 
    @author wm is wei&mei
     * 
    @version 1.00 2011/10/24
     
    */
    package com.hw.wm.calculate;

    import com.hw.wm.data.*;

    public abstract class ACalculateModule implements ICalculateModule{

        public ACalculateModule() {
        }
        
        public ADataProvider adp=null;
        
    }

    抽象计算模块的工厂生产类:

    /**
     * @(#)CalModuleInstanceFactory.java
     *
     *
     * 
    @author wm is wei&mei
     * 
    @version 1.00 2011/10/24
     
    */

    package com.hw.wm.factory;

    import com.hw.wm.calculate.*;

    public class CalModuleInstanceFactory {

        public CalModuleInstanceFactory() {
        }
        
        public static ACalculateModule getModuleForName(String mName)
        {
            ACalculateModule obj=null;
            try
            {
                Class cls = Class.forName(mName);
                System.out.println("load the target class");
                obj=(ACalculateModule)cls.newInstance();
                /*
                Class partypes[] = new Class[2];
                partypes[0] = Integer.TYPE;
                partypes[1] = Integer.TYPE;
                Method meth = cls.getMethod("add", partypes);
                System.out.println("get method of the class");
                Object arglist[] = new Object[2];
                arglist[0] = new Integer(37);
                arglist[1] = new Integer(47);
                
    */
                //object retobj = meth.invoke(methobj, arglist);
                
    //Object retobj = meth.Invoke(cls.newinstance(null), arglist);
                
    //Integer retval = (Integer)retobj;
                
    //System.out.println(retval.intValue());
            }
            catch(Exception e)
            {
                System.err.println(e);
            }
            return obj;
        }
    }

     抽象类ADataProvider

    /**
     * @(#)ADataProvider.java
     *
     *
     * 
    @author wm is wei&mei
     * 
    @version 1.00 2011/10/24
     
    */

    package com.hw.wm.data;

    abstract public class ADataProvider implements IDataProvider{

        public ADataProvider() {
        }
    }

    数据提供者工厂类:

    /**
     * @(#)DataProviderFactory.java
     *
     *
     * 
    @author wm is wei&mei
     * 
    @version 1.00 2011/10/24
     
    */

    package com.hw.wm.data.factory;
    import com.hw.wm.data.*;

    public class DataProviderFactory {

        public DataProviderFactory() {
        }
        
        public static ADataProvider getInstance(DataProviderType dpt)
        {
            try
            {
                if(dpt==DataProviderType.CONSTVAR)
                {
                    return new DpForConst();
                }
            }
            catch(Exception e)
            {
                System.err.println((e.toString()));
            }
            return null;
        }
        
    }

    承包方需要继承抽象类ACalculateModule,并overload getResult()函数;

    /**
     * @(#)ModuleA.java
     *
     *
     * 
    @author 
     * 
    @version 1.00 2011/10/24
     
    */

    package com.hw.wm.module;
    import com.hw.wm.calculate.*;
    public class ModuleA extends ACalculateModule{
        
        public int getResult()
        {
            System.out.println("************moduleA is running~*****************");
            return this.add(adp.getDataA(),adp.getDataB());
        }
        
        public int add(int a,int b)
        {
            return a+b;
        }
        
    }

    实际主测试方法:

    /**
     * @(#)getReflection.java
     *
     *
     * 
    @author wm is wei&mei
     * 
    @version 1.00 2011/10/23
     
    */

    package com.hw.wm.TestCase;

    import java.lang.reflect.*;
    import com.hw.wm.calculate.*;
    import com.hw.wm.factory.*;
    import com.hw.wm.data.factory.*;
    import com.hw.wm.data.*;
    import java.util.Scanner;

    public class getReflection {

        public getReflection() {
        }
        
        public static void main(String[] args)
        {
            System.out.println("Please intput the moduleID to calculate:\n1.com.hw.wm.module.ModuleA\n2.com.hw.wm.module.ModuleB\n3.com.hw.wm.module.ModuleC");
            Scanner scanner = new Scanner(System.in);
            int inID=scanner.nextInt();
            ACalculateModule acm=null;
            switch(inID)
            {
                case 1:
                    acm=CalModuleInstanceFactory.getModuleForName("com.hw.wm.module.ModuleA");//通过代理工厂进行生产数据库中注册的模块
                    break;
                case 2:
                    acm=CalModuleInstanceFactory.getModuleForName("com.hw.wm.module.ModuleB");//通过代理工厂进行生产数据库中注册的模块
                    break;
                case 3:
                    acm=CalModuleInstanceFactory.getModuleForName("com.hw.wm.module.ModuleC");//通过代理工厂进行生产数据库中注册的模块
                    break;
            }
            //ACalculateModule acm=CalModuleInstanceFactory.getModuleForName("com.hw.wm.module.ModuleC");//通过代理工厂进行生产数据库中注册的模块
            
    //System.out.println("acm.getResult()");
            acm.adp=DataProviderFactory.getInstance(DataProviderType.CONSTVAR);//通过工厂提供一个数据的提供者
                                                                               
    //数据抽象到上层,方便框架进行重定向
                                                                               
    //若在模型中选择,则不符合项目中承包方的需要
            if(acm!=null)
            {
                System.out.println(acm.getResult());//调用工厂后的模块,进行计算
            }
            else
            {
                System.out.println("acm is NULL");//工厂生产失败
            }
        }
    }

    其中ACaculateModule实现了ICalculateModule接口,其创建过程是通过工厂模型进行创建;其为一个抽象类;

    其中数据提供类也是同样方式进行实现;

    具体的模型计算模块需要实现ACaculateModule抽象类,抽象类中组合了数据提供类的实例,需要的数据可以直接通过抽象类指针ADataProvider*直接进行读取;

    同时具体的计算模块中需要重载getResult方法;


  • 相关阅读:
    java实现微信红包分配算法
    认识J2SE
    java设计模式(2)
    java设计模式(1)
    模拟做饭系统(java+线程中的join方法)
    学习接水系统(java+thread线程)
    1. linux系统简介
    Codeforces Round #350 (Div. 2)解题报告
    2014蓝桥杯决赛解题报告
    末学者笔记--Python函数一玄
  • 原文地址:https://www.cnblogs.com/weisteve/p/2241024.html
Copyright © 2020-2023  润新知