前面我们通过大概分析了现实中事物的关系及编程规范,消息对象之间关系应该是下图这样的,对象之间只有一个公共方法putMsg,通过这个方法来传递消息,其他任何方法为对象内部方法,其他对象不能调用,只能由对象自己调用。
根据前面定义的对象编程规范,现在就这规范下开始代码实现。对象消息编程框架,与其说框架,不如说是定义一种对象的模板,所有的对象基于定义的统一的对象模板而实现。代码见文章下面链接。我建议有兴趣的朋友下载代码试试,当对象之间通过消息而互动的时候,因为没有了对象之间耦合与依赖,出现许多有趣的事情,也极大的方便了编程,这是我开始都没有想到 。下面对对象模板或框架简单说明。
一、程序包介绍
源码中程序包结构如下;
cn.tianlong.tlobject 为通用包,其中base包是最基础包,里面包含上面所说的对象模板,,其他的包,如db、network、cache是我根据对象模板而开发的其他实用类,用于测试,不一定适用与生产。
cn.tianlong.java 是根据通用包而开发的实际应用环境。其中servletutils包是在tomcat下开发的一个web框架,tlojbectdemo 是普通的环境下java编程框架。这里所说的框架没有任何约束定义,只是类继承所定义的类模板。
二、基础包 cn.tianlong.tlobjcec.base
base包下类如下;
这个包中,基本的类只有6个:IObject 、TLBaseObject 、TlBaseModule 、TLMsg、TlObjectFactory、TLModuleConfig 。前三个是定义的类、对象模板,TLMsg为定义的消息类,TLObjectFactory为对象工厂,也就是统一创造者,TLModuleConfig为对象配置文件读取类。其他的类为一些基于对象模板而开发的实用类,比如日志类,消息广播类、配置文件监控类,这些类根据情况可用不用。以后开发的web框架及应用框架也都是根据上面六个基本类而来。类关系图如下:
(1)IObject 接口
源码;
public interface IObject {
String getName();
TLMsg putMsg(IObject toWho, TLMsg msg);
TLMsg getMsg(Object fromWho, TLMsg msg);
}
IObject是最基本的类模板,IObject用接口的方式实现,里面只有三个方法,其中主要的是发送消息putMsg ,接受消息 getMsg。如果A给B发送消息,则A.putMsg(B,msg)。对于不能继承模板类的情况下,可以用实现该接口的方式来实现。
在接口中还有一个方法 getName,用于获取对象的名字。在我们现实中,任何对象都有个名字,人们通过名字而传递信息,因此消息对象的使用也主要通过名字,名字为字符,方便传递、存储。
(2)TLBaseObject 抽象类
源码;
public abstract class TLBaseObject implements IObject ,TLParamString{
protected String name;
public TLBaseObject() {
name=getClass().getSimpleName();
}
public TLBaseObject(String name )
{
this.name=name ;
}
protected TLMsg createMsg(){
TLMsg cmsg =new TLMsg() ;
cmsg.setSource(name);
cmsg.setNowObjcect(name);
return cmsg ;
}
public String getName() {
return name;
}
public TLMsg putMsg(IObject toWho, TLMsg msg) {
TLMsg pmsg=createMsg().copyFrom(msg);
pmsg.setPrevious(name);
pmsg.setNowObjcect(toWho.getName());
if (msg.getWaitFlag()==true)
return toWho.getMsg(this, pmsg);
else
{
putMsgNoWait( //代码效果参考:http://www.zidongmutanji.com/bxxx/324492.html
toWho, pmsg) ;return null ;
}
}
/ 异步put** /
public void putMsgNoWait(IObject toWho,TLMsg msg){
new ThreadTask(toWho,msg,this).start();
}
private class ThreadTask extends Thread{
private IObject toWho ;
private IObject fromWho ;
private TLMsg msg;
public ThreadTask(IObject toWho ,TLMsg msg,IObject fromWho){
this.toWho=toWho;
this.msg =msg ;
this.fromWho=fromWho;
}
@Override
public void run(){
msg.setWaitFlag(true);
toWho.getMsg(fromWho,msg);
}
}
TLBaseObject 是对上面IObject接口的一个抽象实现。里面主要的是实现了putMsg方法。方法的实现其实是实现两个对象的信息交换,一个putMsg,那么另一个就是getMsg。主要代码其实就一句;
return toWho.getMsg(this, pmsg);、
对于消息,有同步、异步消息之分,这里同步消息直接送出,异步消息则启动一个线程而发出。通过检测消息里面的异步标志来自动判断。消息对象msg里面 waitflag属性定义消息是否为异步。以后对于异步发送,简单设置消息的异步标志就可以了。
if (msg.getWaitFlag()==true)
return toWho.getMsg(this, pmsg);
else
{
putMsgNoWait( toWho, pmsg) ;
return null ;
}
基本上到这里,消息对象模板类已经建立,任何继承TLBaseObject类的对象只要实现getMsg就可以完成消息的互动(putMsg已经实现),对象只负责如何内部处理收到的消息。不过这个类还比较简单,现实中的事情更复杂,在TLBaseObject基础上进一步丰富功能,这就是下面介绍的TLBaseModule。TLBaseModule是最重要的对象模板,以后的类基本继承它。在下一节详细分析它。
日期:2019年1月23日
下载:
1、普通环境消息框架:
2、web环境消息框架:
3、android环境:
说明:
为方便使用,每个环境中都包含了基本框架 。对于android环境中的基本框架,有些不适合的类没有包含,如db、cache等。
为方便使用将web框架运行、测试环境tomcat。
文件包包含所需的第三方类库,可以下载直接编译使用
注:network包下面的server还不完善,仅为自己测试、学习