Основная идея реализации плагинов на любом объектно-ориентированном языке состоит в том, чтобы определить набор общих интерфейсов, которые должен реализовать плагин и связанные с ним классы, а затем загрузить и создать их экземпляры с помощью отражения...
Вы можете использовать абстрактный фабричный шаблон, чтобы можно было создавать экземпляры любых объектов, необходимых плагину...
Предположим, что архитектура вашего плагина имеет только 3 интерфейса, и каждый плагин должен предоставлять классы, реализующие эти интерфейсы, тогда архитектура вашего плагина может быть такой:
public interface PluginInterfaceA {
//Define API here
};
public interface PluginInterfaceB {
// Define API here
};
public interface PluginInterfaceC {
// Define API here
};
public interface PluginFactory {
/**
* Creates plugin A object.
*/
PluginInterfaceA createPluginA();
/**
* Creates plugin B object.
*/
PluginInterfaceB createPluginB();
/**
* Creates plugin C object.
*/
PluginInterfaceC createPluginC();
};
А затем позвольте плагинам определить в файле XML или файле свойств имя класса фабрики плагинов для плагина:
Например, предположим, что ваш плагин определяет:
package com.my.plugin;
public class PluginAImpl implements PluginInterfaceA {
// Code for the class
};
public class PluginBImpl implements PluginInterfaceB {
// Code for the class
};
public class PluginCImpl implements PluginInterfaceC {
// Code for the class
};
public class PluginFactoryImpl implements PluginFactory {
public PluginInterfaceA createPluginA() {
return new PluginAImpl();
}
public PluginInterfaceB createPluginB() {
return new PluginAImpl();
}
public PluginInterfaceC createPluginC() {
return new PluginAImpl();
}
};
А затем определите в файле свойств // Файл plugin.properties, предоставленный в plugin.jar плагина plugin.factory.class = com.my.plugin.PluginFactoryImpl;
В вашем приложении можно сделать
Properties properties = new Properties();
properties.load(this.getClass().getClassLoader().getResourceAsStream("plugin.properties"));
String factoryClass = properties.get("plugin.factory.class");
PluginFactory factory = Class.forName(factoryClass);
PluginInterfaceA interfaceA = factory.createPluginA();
PluginInterfaceB interfaceB = factory.createPluginB();
PluginInterfaceC interfaceC = factory.createPluginC();
// Здесь вызывайте созданные классы по своему усмотрению.
Спасибо, Пабло.
person
Pablo Martin Viva
schedule
28.09.2011