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实例,主要用于实现智能体间消息通信;