最近在写卡牌游戏的战斗系统的代码,服务端用的Java,客户端用的C#,做到BUFF这里发现需要类似于C#的委托这样的功能作为BUFF的触发机制
初步触发需求大概就是:
- 回合开始
- 回合结束
- 受到攻击
- 立即启动
- 等待日后增加
这个需求的特点就是触发条件容易扩展,触发条件分布比较分散
如果在客户端用C#那么就下面几行代码即可解决,但是客户端只需要做BUFF系统的表现效果
public delegate void myEvent(string s);
public Dictionary<string, myEvent> list = new Dictionary<string, myEvent>();
void AnyFunction(){
//注册函数
list["RequestID"]=otherFunction;
}
void Update( ){
//调用委托
list["RequestID"](paraString);
}
BUFF系统数值效果实现是Java环境,Java也有委托、事件,但是跟C#不是一个东西。。。。
思来想去,貌似只有观察者模式比较合用,可是给每个触发条件都实现一个观察者接口。。。。被观察的类就得实现一大堆对应接口。。
和C#的委托比较了一下,最后想了这么段代码应该能满足当前的需求了
//观察者接口,每一个Buff功能子类都要实现这个接口,当
public interface IObserver {
public void Update(String key);
}
在被观察类里设计了一个复杂一点的哈希表作为观察者注册进来的容器,用字符串作为 key 来区分不同的触发条件,然后在需要触发的地方按key进行通知(notify)观察者就可以了,跟C# 委托异曲同工
public class Observable{
//开个复杂点的哈希表
public Map<String, ArrayList<IObserver>>map=new HashMap<String, ArrayList<IObserver>>();
public void register(String key,IObserver o){
map.get(key).add(o);
}
public void remove(String key,IObserver o){
map.get(key).remove(o);
}
public void notify(String key){
for(IObserver ob :map.get(key)){
ob.Update(key);
}
}
}