java的委托代理模式(一)---接口模式
今天,我们来模拟一个应用场景
控制层类:CollectInfoCenter
组件类:HrPanel
HrPanel是一个公共组件类,我们现在需要里面有一个位置需要运行CollectInfoCenter 里的一个方法。除非把CollectInfoCenter 这个方法赋值给HrPanel里面的一个空的方法体,可是在java里面是没有这个模式的!那怎么办呢?这里我用一个接口作为中间过渡,来实现这个委托代理。
中间接口类:IPanelBeforeEditorCreate
public interface IPanelBeforeEditorCreate {
public void _panel_BeforeEditorCreate()throws Exception;
}
在HrPanel中把这个接口当做属性,并且调用这个接口中方法,我们这里假设一次会有多个接口实例
public class HrPanel {
public List<IPanelBeforeEditorCreate> panelBeforeEditorCreates = new ArrayList<>();
//***
// --------------------
// 调用自定义事件的,接口实现过程开始
// *****/
public void add(IPanelBeforeEditorCreate iPanelBeforeEditorCreate){
this.panelBeforeEditorCreates.add(iPanelBeforeEditorCreate);
}
public void remove(IPanelBeforeEditorCreate iPanelBeforeEditorCreate) {
this.panelBeforeEditorCreates.remove(iPanelBeforeEditorCreate);
}
public void notifyListeners()throws Exception{
Iterator iter =this.panelBeforeEditorCreates.iterator();
while (iter.hasNext()) {
IPanelBeforeEditorCreate listener = (IPanelBeforeEditorCreate) iter.next();
listener._panel_BeforeEditorCreate();
}
}
//***
// 调用自定义事件的,反射机制实现过程结束
// --------------------
// *****/
}
// 在这里需要调用外部controller的方法
public void dothis() {
this.notifyListeners();
}
这样组件内部的就写完了,我们开始controller里面的调用,收先我们需要实现这个接口,并且实现接口中的方法,在需要调用的地方我们需要写上
public class CollectInfoCenter implements IPanelBeforeEditorCreate{
public Object GetCollectInfo()
{
HrPanel _panel = new HrPanel();
_panel.add(this);
return _panel.dothis();
}
@Override
public void _panel_BeforeEditorCreate(){
System.out.println("--------------------------------");
System.out.println("调用了 CollectInfoCenter 自定义panel事件");
System.out.println("--------------------------------");
}
}
这样,在hrpanel里面调用dothis的时候,你会发现控制台上输出了
--------------------------------
调用了 CollectInfoCenter 自定义panel事件
--------------------------------
OK,这里我们就实现了像C#中一样的委托事件模式,所有的类只需要实现了我们定义的中间接口,就可以在dothis里面执行自定义的东西,是不是很nice!!!
当然了,如果你觉得写接口比较麻烦的话!那下一章节我们就来看看另外一种比较简单的处理模式(反射机制)