`
jiopi
  • 浏览: 32147 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

模块化系统的设计起点——控制面板

阅读更多

使用JIOPi构建工业化模型的Java模块系统系列文章之二
模块化系统的设计起点——控制面板

 

随着编程语言的进步,系统的描绘方法也发生着进化,随着面向对象编程的OO时代的进入,出现了若干系统构建和描述方法,如目前最流行的UML统一建模语言

 

对于模块化系统来说,设计可能将分为两个环节,系统设计和模块实现设计,模块的内部实现可能还是应当遵循面向对象的设计方式,而系统设计则可能会有所不同。

 

就如同 工业化产品一样,模块化系统也可以很容易的更换掉一个实现模块,而这点依赖于良好的模块化系统的设计,在系统设计阶段,不会有实现类出现,就如同工业化产品的图纸(Blueprint,蓝图)一样,模块化的软件系统设计可能也可以使用图纸来进行描绘,并且最外层的装配图纸可能是非常简单的,就像PC系统,最外层的装配图就是将若干模块与主板相连。

 

也就是说,一个复杂的模块化系统,可能具有多级层次,一个系统是由若干模块相连而成,这是最外层,在这一层次的蓝图设计中,只会定义该层次各个模块的用途的接口方式。而再进入到这其中的一个模块中的时候,一个模块的蓝图设计可能又是由若干模块相连而成,但这一层次的设计是不会出现在最外层的图纸中的。那么模块与模块是如何相连的呢?是通过控制面板(ControlPanel)。

 

这就是JIOPi的模块化系统中,除了蓝图,模块以外,另一个非常重要的概念——控制面板。

 

那么什么是控制面板呢?
控制面板一词来源于工业化系统,用Java语言来说,就是interface,在IoC体系中,对类对象的访问是通过interface来操作的,对模块的访问当然也是。那么为什么不叫interface而叫 ControlPanel呢?因为用于描绘JIOPi蓝图的Java程序并不限制为interface,为了避免语义混淆,而改名为ControlPanel。

 

对于模块化系统而言,要访问一个模块,是无需了解实现类细节的,而唯一需要了解的就是这个模块的蓝图提供了哪些控制面板。对模块的使用,也是从 控制面板开始的。因此一个模块的设计,也就是从 设计控制面板开始的。

 

下面,我就以设计一个假想的简单汽车模型为例来说明JIOPi模块化系统的设计和开发过程。

 

汽车是一个模块蓝图,因此要先绘制汽车的蓝图,为了简单,我只让这个汽车可以开动 start(), 停止 stop(), 以及获取汽车当前状态getStatus(),功能比较简单,因此可以封装在一个 控制面板 之上,代码如下:

 

package star.trek.voyager.blueprint.car;

import org.jiopi.framework.annotation.blueprint.RegisterControlPanel;

@RegisterControlPanel("voyager.car")
@Version
public interface Car {
	public void start();
	public void stop();
	public String getStatus();
}

 为了方便对控制面板的访问简化,使用了 @RegisterControlPanel("voyager.car") 将 star.trek.voyager.blueprint.car.Car 这个控制面板名 注册为短名称 voyager.car,只有一个用途,就是在以后访问时(特别是在配置文件中),只用写短名称就行了,如果觉得没必要可以不添加这个标注。

 

@Version标注上定义了这个蓝图的name,version,versionInterface属性,源码在源码下载包中的ibean-example目录。

 

看到这个类,相信大家都知道这个蓝图能怎么用了,我们下面就先来看看 在JIOPi容器中,如何使用这个蓝图。

 

这里我假设你已经在你的项目的lib中放了iBean的实现容器,如果还没有,请去http://code.google.com/p/ibean/downloads/list 下载,如果你准备使用本地安装模式,请额外下载JIOPi-iBean-0.3.0.0 patch 1,补丁说明请参阅 http://www.jiopi.org/blog/?p=44

 

在传统编程模式下,如果要用这个接口,我想你一定会问我要实现类的下载地址,以及实现类应当如何使用,比如是new 还是 用哪个工厂方法,是否需要修改什么配置文件?

 

在 JIOPi 的模块化系统中,这些都不复存在了(不是没有,是你可以忽略)。下面我们就来看一段 JIOPi所见即所得的代码:

 

import org.jiopi.framework.CentralConsole;
import org.jiopi.framework.FrameworkInitializer;
import org.jiopi.framework.ModuleConsole;
import org.jiopi.framework.ControlPanel;

public class CarTest {
    public static void main(String[] args) {
        FrameworkInitializer.initialize();
	ModuleConsole car = CentralConsole.accessModuleConsole("voyager.benz.car_sls_amg", "0.1.0.0");
	ControlPanel benzSlsAmg = car.accessControlPanel("voyager.car", ControlPanel.class);
	System.out.println(benzSlsAmg.operate("getStatus", String.class));
    }
}

 

你可以直接将该代码复制到你的IDE中运行。
从代码中可以看到,我使用了一个叫做 voyager.benz.car_sls_amg 的模块,版本限定为0.1.0.0
使用accessControlPanel获取到该模块的 voyager.car 控制面板(也就是我们前面定义的那个),
然后运行 getStatus方法

 

这就是 JIOPi 模块化系统的 实现类细节忽略,要使用一个模块,首先需要知道这个模块的蓝图中定义的控制面板,然后获取控制面板进行访问。

 

为了使用Java风格的调用,你可以在你的lib中安装Car的控制面板(帖子后面有下载),于是代码变为

 

import org.jiopi.framework.CentralConsole;
import org.jiopi.framework.FrameworkInitializer;
import org.jiopi.framework.ModuleConsole;
import star.trek.voyager.blueprint.car.Car;

public class CarTest2 {
    public static void main(String[] args) {
        FrameworkInitializer.initialize();
	ModuleConsole car = CentralConsole.accessModuleConsole("voyager.benz.car_sls_amg", "0.1.0.0");
	Car benzSlsAmg = car.accessControlPanel("voyager.car", Car.class);
	System.out.println(benzSlsAmg.getStatus());
    }
}

 

当然,你可以使用其他Ioc框架注入 Car对象而避免在代码中出现JIOPi的API,参见 http://jiopi.iteye.com/blog/656101
当然,你也可以很方便的更换其他实现模块,将voyager.benz.car_sls_amg替换为其他模块的名字即可。

 

 

控制面板的概念就介绍到这里,稍后介绍 voyager.benz.car_sls_amg 的实现,一个完整的模块化系统的实现。

 

 

分享到:
评论

相关推荐

    MPS模块化生产系统.pptx

    总结,MPS模块化生产系统通过集成化的模块设计,实现了生产流程的高度自动化和定制化,提高了生产效率,降低了维护成本。每个工作单元的设计精良,考虑到了实际操作的便利性和可靠性,使得该系统在现代工业生产中...

    基于labview编程语言的登录系统——源代码

    总之,这个基于LabVIEW的登录系统实例是学习图形化编程语言在安全系统设计上的一个良好起点。它展示了如何利用LabVIEW的强大功能来构建用户认证系统,同时,通过LabSQL的使用,我们还可以了解如何在LabVIEW中处理...

    ASP实例开发源码——职威无界asp企业网站建站CMS系统.zip

    3. **后端控制面板**:管理员可以通过这个界面进行内容添加、编辑和删除,管理用户权限等。 4. **服务器端脚本**:ASP文件,包含VBScript或JScript代码,处理服务器端逻辑,如用户登录验证、数据查询、动态内容生成...

    Simulink6_子系统及其封装技术.zip

    通过学习和掌握Simulink子系统及其封装技术,初学者可以更好地构建和管理复杂的模型,从而更高效地进行系统设计和仿真。这份资料“Simulink6_子系统及其封装技术.pdf”将为初学者提供一个良好的起点,引导他们逐步...

    Unity中VR开发插件——VRTK3.3.0

    使用VRTK时,应遵循模块化和组件化的设计原则,保持代码整洁,以利于维护和扩展。 总之,Unity中的VRTK3.3.0为VR开发提供了一个高效、灵活的框架,通过它可以构建出沉浸式且交互性强的VR应用。无论是初学者还是...

    Axure原型:电商网后台管理实例

    《电商后台管理原型设计——基于Axure的实践详解》 在现代互联网行业中,电商网站的后台管理系统是不可或缺的重要部分,它负责处理各种业务流程,包括商品管理、订单处理、用户管理、营销活动等。本篇内容将围绕...

    安卓Android源码——Fragment实现tab实例 代码.rar

    总之,通过 `Fragment` 和 `TabHost`,开发者可以轻松地在 Android 应用中创建具备多页签功能的界面,同时保持代码的模块化和清晰度。虽然现代 Android 开发更倾向于使用 `ViewPager` 或 `BottomNavigationView` 等...

    LabVIE基础课程_labview_

    LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是美国国家仪器公司(NI)开发的一款图形化编程环境,专门用于创建虚拟仪器、数据采集、数据分析和控制系统的应用软件。它以其独特的图标化编程方式...

    LabVIEW钢琴labview源文件

    8. **自定义VI库**:可能还使用了自定义VI库,封装了一些常用的音乐处理函数,提高代码复用性和模块化。 通过学习和研究这个LabVIEW钢琴源文件,开发者不仅可以了解到如何在LabVIEW中创建交互式应用程序,还可以...

    labview2011虚拟频谱分析仪

    LabVIEW的前面板设计工具可以帮助创建直观、易用的控制面板。 9. **系统优化**:优化代码执行效率,确保在有限的硬件资源下,虚拟频谱分析仪能够快速、稳定地运行,是课程设计中的重要一环。 10. **文档与报告**:...

    CamWidget0.0.4.7z

    在视频监控系统中,PyQt5被用来设计和实现用户界面,如显示视频流的窗口、控制面板等。通过PyQt5,开发者能够创建出直观、易用的界面,使得用户可以轻松地操作和配置监控设备。 再者,picamera是针对树莓派的Python...

    lego机器人编程入门

    然后,从自模块中选择“Display”模块并将其拖拽到程序面板中。如果需要查看显示函数的详细功能描述,可以通过按“Ctrl”+“H”键,或双击图标查看。 - **编写HelloWorld程序**:作为学习LabVIEW编程的起点,学生会...

    PHP旅游网站.zip

    2. `dede/`:织梦的后台管理界面,包含登录页面、控制面板和其他管理功能。 3. `templates/`:存放网站模板文件,包括首页、详情页、列表页等,可以自定义修改以满足设计需求。 4. `uploads/`:用于存储上传的图片、...

    dashboard 网站后台 .sketch素材下载

    这些符号可以随时更新,所有实例都会自动同步,非常适合构建模块化的dashboard设计。 3. **图层组织**:Sketch的图层结构清晰,便于管理复杂设计。了解图层的层次关系和编组方式,能帮助你找到并修改特定元素。 4....

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler) 17 1.5.3 Java类库(Java Class Libraries) 17 1.5.4 Java虚拟机(Java Virtual ...

    labview 实验例程

    8. **模块化编程**:子VI的使用能提高代码的重用性和可维护性,例程可能包含如何创建和调用子VI的例子。 9. **错误处理**:理解如何使用错误处理结构来捕获和处理可能出现的问题,是编写健壮程序的关键。 通过学习...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler) 17 1.5.3 Java类库(Java Class Libraries) 17 1.5.4 Java虚拟机(Java Virtual ...

    汽车电子中的飞思卡尔EL和SL MCU增强汽车与工业设计性能及精确性

    EL系列在设计上增强了内存和外设,适合需要更高性能的汽车LIN应用,如灯光控制系统、天窗控制、座椅调节电机、控制面板以及门锁等。SL系列则面向成本敏感的项目,提供性价比高的选择。 这两款MCU系列包含嵌入式...

Global site tag (gtag.js) - Google Analytics