我们重新审视的以下 JAVA 的 Object 的对象 , 其中包含了两个特殊的方法, equals 和 clone ,从这两个方法我们可以看出,在面向对象的程序设计中,对象的设计不能紧紧参考其所描述的对象,而不是不可添加其他便于对象活动的行为的。为什么会有这样的结论, equals 的判断两个对象是否相同,这种对象与对象之间相同与否的问题,是只有具备智能的动物或者智能机器人才有的能力做这样的结论,大多数的对象是没有此能力的, clone 就不必说了。故做对象设计不必严格遵守现实,现在大家在写程序的时候经常创建的 javabean ,只有 setter 和 getter ,也是一种无活力对象,只具备传递数据的能力,而且要配合对应的 service 方法才完成工作, service 类就是一个方法集,严格来讲不是面向对象编程。
我们不必在意是否遵守了面向对象的设计方法,能提高生产力的方法,就是好方法。我尝试了一种新的设计方法,看是否可以提高生产力,大家不妨看看。
第一, Object 对象已经具备 equals 和 clone 了这样的智能方法了,我们不妨再让这个 object 聪明点,给他提供记忆联想功能。接下来的两点详细说明。
第二,很多对象是需要存储的,对象储取能力不需要外部提供,而是继承提供存取能力的对象,这就好像说,你家养的狗狗可以自己到宠物管理机构登记和变更它自己的信息了(听着都轻松),不用那么现实。
第三,世界上任何对象都不是孤立存在,而是相互影响的,存在因果关系的,一种原因能产生什么样的结果,有些是一定的,有的却不一定,对象之间的关联,有些情况是联系紧密的、有些是疏散的,对象具备自己的关系网络。如你目睹一起三车相撞的事故,其中一人的腿的伤势给你印象深刻,以后任何人提起腿受伤,你都会想起那个人,接着想起亲眼目睹那次事故,你还可以想到这起事故具体是如何发生的,即有点到面,有面到体,逐步深入。下面是我的一个对象设计(源代码 https://sourceforge.net/projects/thinery/files/try.zip/download
):
public abstract class IObject extends Observable {
protected static boolean inited = false;
public IObject() {
.......
}
/**
* 对象第一此加载的时候初始化所有的监听器,该类的活动如果影响的其他对象
* 都可以在监听器完成因果传递,监听器统一配置在一个叫:[子类名称]_lstnr.properties
* 的配置文件中,如果对象找不到该文件,会认为没有监听器
*/
static Map<String, Observer> observers = new HashMap();
/**
* 把对象自身持久的数据库的方法。子类可以根据类的情况,重写该方法。 如该类是一对一,一对多的,想把关联对象一起存储,就需要重写该方法
*
* @throws RuntimeException
*/
public abstract void remember();
/**
* 删除此对象对应的数据库记录。 恰如我们忘记一件事物
*/
public abstract void forget();
/**
* 用于更新数据库记录,需要更新对象的某一个属性时,用到此方法。 恰如我们需要更新对一件事物的记忆。
* 我们每隔三天去看一个正在建设的高楼,那么大脑每次都要更新高楼的高度。
*
* @param updateFields
* 属性的名称,如果你更改username的值,那么这个参数就应该是username, 注意不是username的值
*/
public abstract void updateMemory(String... updateFields);
/**
* 这是一个最自由的方法,该类方法名称意为”联想“,最好的默认实现是查询相关对象。 如:我们通过宝马,联想到奔驰和奥迪。
* 如果这是一个事件对象,那么你可以让他想到与这个事件相关的任何东西。
*
* @param params
* 任何对象
* @return
*/
public abstract List associate(Object... params);
/**
* 根据主键数据库中获取全部信息
*
* @param id
* @return
*/
public abstract void obtainMe();
protected String getThisName() {
String name = this.getClass().getName();
int b = name.lastIndexOf(".");
String shortName = name.substring(b + 1);
return shortName;
}
private void initOberserver() throws IOException, InstantiationException,
IllegalAccessException, ClassNotFoundException {
InputStream inStream = this.getClass().getClassLoader()
.getResourceAsStream(this.getThisName() + "_lstnr.properties");
if (inStream != null) {
Properties temp = new Properties();
temp.load(inStream);
Iterator<Entry<Object, Object>> iter = temp.entrySet().iterator();
while (iter.hasNext()) {
Entry e = iter.next();
String key = (String) e.getKey();
String value = (String) e.getValue();
Observer obsr = (Observer) Class.forName(value).newInstance();
observers.put(key, obsr);
}
}
}
}