AnyLogic服务块高级区如何动态设置代理类型?
AnyLogic服务块动态设置代理类型的最优方案
方法1:给代理类添加类型标识属性
- 先在reg_cust和ch_cust代理类里加一个枚举类型属性(比如命名为
customerType),枚举值设REGULAR和CARD_HOLDER。 - 在生成代理的源块里,直接给这个属性赋值:普通客户设
agent.customerType = CustomerType.REGULAR,持卡客户设agent.customerType = CustomerType.CARD_HOLDER。 - 服务块高级区域的代理类型判断代码改成:
if (agent.customerType == CustomerType.REGULAR) { return reg_cust; } else { return ch_cust; }
- 这个方法比用颜色判断靠谱多了,颜色可能被其他逻辑意外修改,而专门的类型属性是用于区分客户类型的专属标识,不会随便变动。
方法2:直接判断代理的类类型
- 不用额外加属性,直接通过
instanceof关键字判断代理所属的类: - 服务块里的代码改成:
if (agent instanceof reg_cust) { return reg_cust; } else { return ch_cust; }
- 这是最省事的实现方式,不需要修改代理类的结构,适合已经定义好两类代理的场景。
方法3:使用代理继承体系
- 如果reg_cust和ch_cust有共同的父类(比如
Customer),可以在父类里定义一个抽象方法来获取代理类类型,子类分别实现:- 父类
Customer添加方法:public abstract Class<? extends Customer> getCustomerClass(); - reg_cust子类实现:
@Override public Class<? extends Customer> getCustomerClass() { return reg_cust.class; } - ch_cust子类同理返回
ch_cust.class。
- 父类
- 服务块里直接返回
agent.getCustomerClass()就行。 - 这种方式符合面向对象的设计原则,后续新增客户类型时,只需要新增子类并实现方法,扩展性很强。
内容的提问来源于stack exchange,提问作者nani869
相关产品推荐
相关产品推荐

