项目中遇到这样一个问题,sip协议的消息种类很多,在不同的场景下,收到底层送上来的message时,不得不进行大量instanceof的类型判断,效率低而且不易维护,考虑到sip消息种类相对固定,可以使用visitor设计模式。
public abstract class Message {
public abstract void accept(Handler h);
}
public class InviteMsg extends Message {
@Override
public void accept(Handler h) {
h.handleInvite(this);
}
}
public class InfoMsg extends Message {
@Override
public void accept(Handler h) {
h.handleInfo(this);
}
}
public class ByeMsg extends Message {
@Override
public void accept(Handler h) {
h.handleBye(this);
}
}
public abstract class Handler {
public abstract void handleInvite(Message msg);
public abstract void handleBye(Message msg);
public abstract void handleInfo(Message msg);
}
public class SimpleCallHandler extends Handler {
@Override
public void handleInvite(Message msg) {
//do what you want for simple call
}
@Override
public void handleBye(Message msg) {
//do what you want for simple call
}
@Override
public void handleInfo(Message msg) {
//do what you want for simple call
}
}
public class GroupCallHandler extends Handler {
@Override
public void handleInvite(Message msg) {
//do what you want for group call
}
@Override
public void handleBye(Message msg) {
//do what you want for group call
}
@Override
public void handleInfo(Message msg) {
//do what you want for group call
}
}
public class ConferenceHandler extends Handler {
@Override
public void handleInvite(Message msg) {
//do what you want for conference call
}
@Override
public void handleBye(Message msg) {
//do what you want for conference call
}
@Override
public void handleInfo(Message msg) {
//do what you want for conference call
}
}
public class Client {
private Handler handler;
public Client(Handler handler){
this.handler = handler;
}
public void recievedMessage(Message msg){
msg.accept(handler);
}
}