Java设计模式--思路总结

抽象类

抽象类获得子类的构造参数

此思路来源于:ApplicationEvent

自定义Spring的事件时,这样定义:

package com.example.tmp;

import org.springframework.context.ApplicationEvent;

public class MyEvent extends ApplicationEvent {
    public MyEvent(Object source) {
        super(source);
    }
}

如果不加这个有参构造函数,则会报错:

源码

public abstract class ApplicationEvent extends EventObject {
	private static final long serialVersionUID = 7099057708183571937L;

	private final long timestamp;

	public ApplicationEvent(Object source) {
		super(source);
		this.timestamp = System.currentTimeMillis();
	}

	public final long getTimestamp() {
		return this.timestamp;
	}

}
public class EventObject implements java.io.Serializable {
    private static final long serialVersionUID = 5516075349620653480L;

    protected transient Object  source;

    public EventObject(Object source) {
        if (source == null)
            throw new IllegalArgumentException("null source");

        this.source = source;
    }

    public Object getSource() {
        return source;
    }

    public String toString() {
        return getClass().getName() + "[source=" + source + "]";
    }
}

ApplicationEvent类关系

 

总结

Spring最终使用EventObject来存事件数据(source字段),它有抽象的子类(本处是ApplicationEvent),并让抽象子类在构造函数中super父类,参数为事件数据。

一方面:继承了ApplicationEvent的普通类就必须提供一个有参构造函数,且必须要super()来调用ApplicationEvent这个抽象类的构造函数(因为抽象类自己不能直接实例化,必须由子类实例化)

另一方面:因为ApplicationEvent抽象类在构造函数中super父类,参数为事件数据,所以,EventObject就可以存入事件数据了。

 EventObject是个基类,它有很多子类(都是抽象类),ApplicationEvent是其中一个子类。EventObject保存事件数据,子类会进行一些扩展,而且子类都像ApplicationEvent一样,有有参构造函数,并在里边super来调用EventObject的构造函数。

接口

多实现类实现同一接口

interface ITop
 
interface IA extends ITop
class AImpl implements IA
 
interface IB extends ITop
class BImpl extends AImpl implements IB

猜你喜欢

转载自blog.csdn.net/feiying0canglang/article/details/115025337