博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RapidMiner Studio之Process源码分析
阅读量:4710 次
发布时间:2019-06-10

本文共 5371 字,大约阅读时间需要 17 分钟。

      RapidMiner的核心处理类是Process,其是Operator的集合,而ProcessRenderer是负责Process上的事件。

      com.rapidminer.Process是用观察者模式实现的,这里套用下《JAVA与模式》一书中对观察者模式的定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

      下面来看下Process类的实现:

      Observable接口:  

     Observer接口(观察者)

package com.rapidminer.tools;/** * @see Observable  * @author Simon Fischer * */public interface Observer {    public void update(Observable observable, A arg);    }

     AbstractObservable:是Observable接口的实现类

package com.rapidminer.tools;import java.util.LinkedList;import java.util.List;import java.util.NoSuchElementException;import javax.swing.SwingUtilities;/** * @author Simon Fischer */public class AbstractObservable implements Observable {    //普通的观察者    private final LinkedList
> observersRegular = new LinkedList
>(); //启用EDT的观察者 private final LinkedList
> observersEDT = new LinkedList
>(); //锁对象,同步时候在此对象上加锁 private final Object lock = new Object(); @Override public void addObserverAsFirst(Observer observer, boolean onEDT) { if (observer == null) { throw new NullPointerException("Observer is null."); } if (onEDT) { synchronized (lock) { observersEDT.addFirst(observer); } } else { synchronized (lock) { observersRegular.addFirst(observer); } } } @Override public void addObserver(Observer observer, boolean onEDT) { if (observer == null) { throw new NullPointerException("Observer is null."); } if (onEDT) { synchronized (lock) { observersEDT.add(observer); } } else { synchronized (lock) { observersRegular.add(observer); } } } @Override public void removeObserver(Observer observer) { boolean success = false; synchronized (lock) { success |= observersRegular.remove(observer); success |= observersEDT.remove(observer); } if (!success) { throw new NoSuchElementException("No such observer: "+observer); } } /** Updates the observers in the given list. */ private void fireUpdate(List
> observerList, A argument) { for (Observer observer : observerList) { observer.update(this, argument); } } /** Equivalent to fireUpdate(null). */ protected void fireUpdate() { fireUpdate(null); } /** Updates all observers with the given argument. */ protected void fireUpdate(final A argument) { // lists are copied in order to avoid ConcurrentModification occurs if updating // an observer triggers insertion of another List
> copy; synchronized (lock) { copy = new LinkedList
>(observersRegular); } fireUpdate(copy, argument); if (!observersEDT.isEmpty()) { final List
> copyEDT; synchronized (lock) { copyEDT = new LinkedList
>(observersEDT); } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { fireUpdate(copyEDT, argument); } }); } }}

     下面来看Process类

     成员变量:

     

    MainFrame中的NEW_ACTION属性是负责响应创建新的process动作的,我们以此为入口,分析process类是如何工作的。

    通过前面action的分析我们已经知道,Action中的actionPerformed方法是用来响应事件的,NewAction类的方法很简单,就是调用MainFrame中的newProcess方法来创建一个process窗口

public void newProcess() {        //在创建新的process之前,询问是否要停止正在运行(暂停)的process        if (getProcessState() == Process.PROCESS_STATE_RUNNING || getProcessState() == Process.PROCESS_STATE_PAUSED) {            if (SwingTools.showConfirmDialog("close_running_process",                    ConfirmDialog.YES_NO_OPTION) == ConfirmDialog.NO_OPTION) {                return;            }        }         //关闭当前打开的process        if (close(false)) {            // undoindex标识置为0,undolist置空,undoaction和redoaction禁用            resetUndo();                        //停止当前运行的process(因为是以线程方式运行的,只有正在运行的operator完成之后,process线程才会退出)            stopProcess();            changed = false;             //创建新的process,设置并注册监听            setProcess(new Process(), true);            addToUndoList();            if (!"false".equals(ParameterService.getParameterValue(PROPERTY_RAPIDMINER_GUI_SAVE_ON_PROCESS_CREATION))) {                SaveAction.save(getProcess());            }            SAVE_ACTION.setEnabled(false);        }    }

     

转载于:https://www.cnblogs.com/fairy511/p/4645422.html

你可能感兴趣的文章
ASP.NET Core根据环境切换NLog配置
查看>>
高质量程序设计指南c++/c语言(20)--符号常量
查看>>
strncpy实现
查看>>
华为机试——字符倒叙输出
查看>>
SQLite3中dos命令下退出"...>"状态的方法
查看>>
json/xml processing model与xml和json的简要区别
查看>>
通过Html5 Canvas画柱状图
查看>>
青蛙跳台阶(Fibonacci数列)
查看>>
洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]
查看>>
Codeforces Round #316 (Div. 2)C. Replacement(模拟)
查看>>
Python入门学习笔记17(sqlalchemyd的使用)
查看>>
.NET CORE TOKEN 权限验证
查看>>
.Net Core 中间件之主机地址过滤(HostFiltering)源码解析
查看>>
Lucene.Net 2.3.1开发介绍 —— 一、接触Lucene.Net
查看>>
java PDF分页打印
查看>>
数链剖分小结
查看>>
应用nslookup命令查看A记录、MX记录、CNAME记录和NS记录
查看>>
APT攻击
查看>>
做衡八的日子(转自VFleaking)
查看>>
day7.条件和循环
查看>>