详尽分享统一对象消息编程(4)—对象消息编程框架1(基本接口)

简介: 详尽分享统一对象消息编程(4)—对象消息编程框架1(基本接口)

前面我们通过大概分析了现实中事物的关系及编程规范,消息对象之间关系应该是下图这样的,对象之间只有一个公共方法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还不完善,仅为自己测试、学习

相关文章
|
3月前
|
消息中间件 网络协议 Java
【消息队列开发】 实现BrokerServer类——本体服务器
【消息队列开发】 实现BrokerServer类——本体服务器
|
1月前
|
JSON 前端开发 API
一文讲清 API 接口的概念、设计和实现
总结 在这个例子中,我们创建了一个简单的Express服务器,并定义了一个/api/auth/login的POST接口来处理登录请求。我们使用body-parser中间件来解析请求体中的JSON数据,并在接口内部进行简单的用户名和密码验证。
|
3月前
|
前端开发 JavaScript
详尽分享组件的封装方法【比较高级方法】★★★★★★★
详尽分享组件的封装方法【比较高级方法】★★★★★★★
13 0
|
4月前
|
前端开发
|
11月前
|
设计模式 Go
Go语言事件系统设计解析:发布-订阅模式实战
Go语言事件系统设计解析:发布-订阅模式实战
400 0
|
4月前
|
前端开发
|
算法 Java Android开发
抽丝剥茧聊Kotlin协程之Job是如何建立结构化并发的双向传播机制关系的
抽丝剥茧聊Kotlin协程之Job是如何建立结构化并发的双向传播机制关系的
抽丝剥茧聊Kotlin协程之Job是如何建立结构化并发的双向传播机制关系的
|
缓存 监控 前端开发
消息复杂计算的抽象和简化
本文将介绍客户端消息数据计算的问题与解决方案。
161 0
消息复杂计算的抽象和简化
|
iOS开发
iOS网络编程之五——请求回执类NSURLResponse属性简介
iOS网络编程之五——请求回执类NSURLResponse属性简介
266 0
|
架构师 开发者 iOS开发
探究ReactiveCocoa 底层KVO封装流程
一、对比原生KVO,初识ReactiveCocoa的KVO * 我们先来看一段代码,通过触屏来动态修改视图背景色 @interface ViewController () @property (nonatomic, strong)UIColor * bgColor; @end @implemen...
3114 0