Author:赵志乾
Date:2024-06-14
Declaration:All Right Reserved!!!
1. 类图
2. 原理解析
2.1 核心函数:
Port作为各类型端口的基类,其核心方法如下 :
函数 | 功能 |
Port(Agent owner) | 构造函数,入参指定端口所属的智能体; |
void connect(Port<OutMessageType,InMessageType> port) void disconnect(Port<OutMessageType,InMessageType> port) | 与和owner同层级的Agent的端口建立或取消连接; |
void map(Port<InMessageType,OutMessageType> port) void unmap(Port<InMessageType,OutMessageType> port) | 与内嵌智能体的端口建立或取消连接; |
void map(Statechart statechart) void unmap(Statechart statechart) | 与owner内的状态图建立或取消连接; |
void send(OutMessageType msg) | 发出消息 |
void receive(InMessageType msg) | 接收消息 |
List<Port<OutMessageType,InMessageType>> getFlatLinks() | 获取该端口与owner同层级的Agent建立连接的端口列表; |
List<Port<InMessageType,OutMessageType>> getUpLinks() | 获取该端口与owner的容器智能体建立连接的端口列表; |
List<Port<InMessageType,OutMessageType>> getDownLinks() | 获取该端口与owner内嵌智能体建立连接的端口列表; |
List<Statechart> getStatechartLinks() | 获取该端口与owner内建立连接的状态图列表; |
2.2 连接类型图形说明
2.3 代码解析
由于AnyLogic内核做过代码混淆,以下代码为二次加工后的内容,与源码不同;
//**************************** Port核心字段******************************************
// 该端口的owner
private transient Agent owner;
// 该端口与和owner同层级Agent建立连接的端口列表
protected transient List<Port<OutMessageType, InMessageType>> flatLinks;
// 该端口与owner的容器Agent建立连接的端口列表
protected transient List<Port<InMessageType, OutMessageType>> upLinks;
// 该端口与owner的内嵌Agent建立连接的端口列表
protected transient List<Port<InMessageType, OutMessageType>> downLinks;
// 该端口与owner的状态图建立连接的状态图列表
protected transient List<Statechart> statecharts;
//****************************构造函******************************************************
Port(Agent owner){
this.owner = owner;
this.flatLinks = new LinkedList<>();
this.upLinks = new LinkedList<>();
this.downLinks = new LinkedList<>();
this.statecharts = new LinkedList<>();
}
//************依据建立或取消连接的场景,在对应的列表中进行元素的增删维护**********************
public void connect(Port<OutMessageType, InMessageType> port) {
// 避免重复添加,即接口调用具有幂等性
if (this.flatLinks.contains(port)) {
return;
}
this.flatLinks.add(port);
port.flatLinks.add(this);
}
public void disconnect(Port<OutMessageType, InMessageType> port) {
this.flatLinks.remove(port);
port.flatLinks.remove(this);
}
public void map(Port<InMessageType, OutMessageType> port) {
this.downLinks.add(port);
port.upLinks.add(this);
}
public void unmap(Port<InMessageType, OutMessageType> port) {
this.downLinks.remove(port);
port.upLinks.remove(this);
}
public void map(Statechart statechart) {
this.statecharts.add(statechart);
}
public void unmap(Statechart statechart) {
this.statecharts.remove(statechart);
}
//****************************消息收发**************************************************
public void send(OutMessageType message) {
if (this.owner.executeOnSendActionOf(this, message)) {
// owner的容器Agent建立连接的端口逐个发送消息
for(Port<OutMessageType,InMessageType> port : this.upLinks){
port.send(message);
}
// owner同级Agent建立连接的端口逐个接收消息
for(Port<OutMessageType,InMessageType> port : this.flatLinks){
port.receive(message);
}
}
}
public void receive(InMessageType message) {
boolean need = this.owner.executeOnReceiveActionOf(this, message);
this.owner.onChange();
if (need) {
// owner内嵌Agent建立连接的端口逐个接收消息
for(Port<InMessageType, OutMessageType> port : this.downLinks){
port.receive(message);
}
// owner状态图建立连接的逐个接收消息
for(Statechart statechart : this.statecharts){
statechart.receiveMessage(message);
}
}
}
3. 应用场景
图形编辑窗口拖入Port组件后,Anylogic将自动创建Port实例,主要用于实现智能体间消息通信;