(Packet PacketHandler), . ( ThatHandler)
Packet ------------> PacketHandler
^ ^
| |
ThisPacket --------> ThisPacketHandler
. , factory .
(, , Packet:
abstract class Packet<T extends Packet<T>> {
abstract PacketHandler<T> getHandler();
}
:
class ThisPacket extends Packet<ThisPacket> {
@Override
PacketHandler<ThisPacket> getHandler() {
return new ThisPacketHandlerImpl();
}
}
class ThatPacket extends Packet<ThatPacket> {
@Override
PacketHandler<ThatPacket> getHandler() {
return new ThatPacketHandlerImpl();
}
}
PacketHandlers ( ):
interface PacketHandler<P extends Packet<P>> {
boolean handle(P p);
}
class ThisPacketHandlerImpl implements PacketHandler<ThisPacket> {
@Override
public boolean handle(ThisPacket p) {
return false;
}
}
class ThatPacketHandlerImpl implements PacketHandler<ThatPacket> {
@Override
public boolean handle(ThatPacket p) {
return false;
}
}
, :
class HandlersRegistry {
static <P extends Packet<P>> PacketHandler<P> getHandler(P p) {
return p.getHandler();
}
}
:
ThisPacket somePacket = new ThisPacket();
PacketHandler<ThisPacket> handler = HandlersRegistry.getHandler(somePacket);
handler.handle(somePacket);
, , . Packet PacketHandler. getHandler() Packet, . .