基于OSGI 框架 的客户端接口设计

package com.dahua.ibp.client.base.services.base;


/**
* 所有接口的基类
* @author 18002
*
*/
public interface BaseService {

/**
* 获取当前实现Bundle的名字,用来区分实现同一接口的不同组件,<br>
* 实现同一接口的不同组件的该方法返回值必须不同,否则程序中无法区分
* @sample: HelloWorld,HelloBigWorld
* @return String 组件名称
*/
public String getBundleName();

/**
* 获取当前实现接口的名字,实现同一接口表示组件的功能类似
* @sample: HelloWorldService
* @return String 接口名称
*/
public String getInterfaceName();

}
//==========================================================
package com.dahua.ibp.client.base.services.base;

public abstract interface UICommon extends BaseService{
/**
* 更新界面组件语言
* @return IBPClientConstant.ERROR_ISFREE 组件已被释放 <br>
*         IBPClientConstant.SUCCESS 执行成功
*/
public int updateLanguage();

/**
* 更新界面组件的皮肤
* @return IBPClientConstant.ERROR_ISFREE 组件已被释放 <br>
*     IBPClientConstant.SUCCESS 执行成功
*/
public int updateSkin();

/**
* 释放当前类的实例
* @return IBPClientConstant.ERROR_ISFREE 组件已被释放 <br>
*     IBPClientConstant.SUCCESS 执行成功
*/
public int free();
}
//==========================================================
package com.dahua.ibp.client.base.services.base;

/**
* 用来创建组件并能对所有由它组件出来的组件进行管理
* @author 18002
*
*/
public interface UICreateService extends UICommon{
/**
* 创建当前类的实例
* @param parent 界面意义上的父窗口,SWT中如composite、shell等
* @return UIBaseService 界面基础接口的对象
*/
public UIBaseService create(Object parent);

/**
* create的重载,增加类型参数,支持组件多样化
* @param parent 界面意义上的父窗口,SWT中如composite、shell等
* @param style 组件类型,由组件自身定义
* @return UIBaseService 界面基础接口的对象
*/
public UIBaseService create(Object parent,int style);
}
//==========================================================
package com.dahua.ibp.client.base.services.base;

/**
* 所有界面接口的基类
* @author 18002
*
*/
public interface UIBaseService extends UICommon{
/**
* 设置当前对象的父窗口,将改变当前对象的显示位置
*
* @param parent 父窗口对象,SWT中如composite、shell等
* @return IBPClientConstant.ERROR_ISFREE 组件已被释放 <br>
*     IBPClientConstant.SUCCESS 执行成功 <br>
*     IBPClientConstant.ERROR_ISNULL 参数为空,不合法
*/
public int setParent(Object parent);

/**
* 获取当前对象的父窗口
*
* @return Object 父窗口对象,SWT中如composite、shell等 <br>
*         null   获取父窗口失败
*/
public Object getParent();

/**
* 显示该组件
* @return IBPClientConstant.ERROR_ISFREE 组件已被释放 <br>
*     IBPClientConstant.SUCCESS 执行成功 <br>
*/
public int show();

/**
* 设置组件是否可见
* @param visible true可见,false不可见
* @return IBPClientConstant.ERROR_ISFREE 组件已被释放 <br>
*     IBPClientConstant.SUCCESS 执行成功 <br>
*/
public int setVisable(Boolean visible);

/**
* 判断该组件是否被释放
* @return true 已经释放 <br>
*    false 未释放
*/
public boolean isFree();

/**
* 返回承载组建的容器
* @return Object 承载组建的容器,SWT中如composite、shell等
*/
public Object getComp();

/**
* 获取创建UI实例的类,以备在检测到创建的对象被释放后可以再次创建
* @return UICreateService 返回创建组件的实例
*/
public UICreateService getCreator();

/**
* 返回组件对用户的显示名称,支持换语言
* @return String 组件对用户的显示名称
*/
public String getDisplayName();

/**
* 返回用户看到的组件小图标的路径,支持换皮肤
* @return String 用户看到的组件小图标的路径
*/
public String getDisplayImage();
// /**
// * 对应create方法中的style,没有用到的返回0
// * @return
// */
// public int getStyle();

}
//==========================================================
package com.dahua.ibp.client.base.services.base;

/**
* 用来创建功能组件并能对所有由它组件出来的组件进行管理
* @author 18002
*
*/
public interface NUICreateService extends BaseService{
/**
* 创建当前类的实例
* @return NUIBaseService 功能组件基础接口的对象
*/
public NUIBaseService create();
}
//==========================================================
package com.dahua.ibp.client.base.services.base;

/**
* 所有功能组件接口的基类
* @author 18002
*
*/
public interface NUIBaseService extends BaseService{

}


//==========================================================
接下来是两个抽象类,简化具体类的实现

package com.dahua.ibp.client.base.services.base;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


public  abstract class UICreator  implements UICreateService{

private List<UIBaseService>  myList = new ArrayList<UIBaseService>();
protected UIBaseService myCom = null;// 被创建的组件的接口引用

public UICreator() {
}

public abstract void setMyCom(Object parent, int style);

@Override
public int updateLanguage() {
RemoveFreeOnes();
Iterator<UIBaseService> iterator = myList.iterator();
while(iterator.hasNext()){
iterator.next().updateLanguage();
}
return IBPClientConstant.SUCCESS;
}

/**
* 从myList中移除已经被自己释放的对象
*/
private void RemoveFreeOnes() {
Iterator<UIBaseService> iterator = myList.iterator();
while(iterator.hasNext()){
//使用迭代的方法操作节点没有副作用
if(iterator.next().isFree())
iterator.remove();
}
}

@Override
public int updateSkin() {
RemoveFreeOnes();
Iterator<UIBaseService> iterator = myList.iterator();
while(iterator.hasNext()){
iterator.next().updateSkin();
}
return IBPClientConstant.SUCCESS;
}

@Override
public int free() {
RemoveFreeOnes();
Iterator<UIBaseService> iterator = myList.iterator();
while(iterator.hasNext()){
iterator.next().free();
}
return IBPClientConstant.SUCCESS;
}

@Override
public UIBaseService create(Object parent) {
setMyCom(parent, 0);
if(myCom!=null){
myList.add((UIBaseService)myCom);
myCom.updateLanguage();//这里已经调用,所以不需要在里面调用了
myCom.updateSkin();
return myCom;
}
return null;
}

@Override
public UIBaseService create(Object parent, int style) {
setMyCom(parent, style);
if(myCom!=null){
myList.add((UIBaseService)myCom);
myCom.updateLanguage();
myCom.updateSkin();
return myCom;
}
return null;
}

}

//==========================================================
package com.dahua.ibp.client.base.services.base;

import org.eclipse.swt.widgets.Composite;

public abstract class UIBaser implements UIBaseService{

protected Composite myComposite=null;

@Override
public int free() {
if (isFree())
return IBPClientConstant.ERROR_ISFREE;
myComposite.dispose();
myComposite = null;
return IBPClientConstant.SUCCESS;
}

@Override
public int setParent(Object parent) {
if (isFree())
return IBPClientConstant.ERROR_ISFREE;
if(parent!=null){
myComposite.setParent((Composite) parent);
myComposite.layout();
return IBPClientConstant.SUCCESS;
}
return IBPClientConstant.ERROR_ISNULL;
}

@Override
public Object getParent() {
if (isFree())
return null;
return myComposite.getParent();
}

@Override
public int setVisable(Boolean visible) {
if (isFree())
return IBPClientConstant.ERROR_ISFREE;
myComposite.setVisible(visible);
return IBPClientConstant.SUCCESS;
}

@Override
public boolean isFree() {
if (myComposite == null || myComposite.isDisposed()) {
return true;
}
return false;
}

@Override
public Object getComp() {
if (isFree())
return null;
return myComposite;
}
}

猜你喜欢

转载自xuwhyse.iteye.com/blog/1879865