Jag håller på med en P2P simulator. Bland annat simulerar den hur paket skickas mellan olika noder. Eftersom det är en simulator spelar storleken på paket ingen roll. Problemet är hur man skall skapa olika typer av paket. Det finns paket för att sprida sin position, för att tal om vilka noder som finns i en grupp etc. Problemet är hur man skall designa dessa. De har alla vissa egenskaper gemensamt.
En lösning kan vara att ha ett interface eller en basklass som alla pakettyper ärver ifrån. Nackdelen med det är att man måste använda instanceof för att kolla vilket paket man verkligen har och sedan använda rätt metoder.
Den andra lösningen är att definiera en massa konstanter för att skilja paketen åt. Man kan då lätt kolla vilken typ av paket det är man har fått.
Problemet är att jag inte tycker någon av lösningarna är speciellt snygg. I praktiken är det två sätt att sätta flaggor på objekten för att se vilka metoder de har. Vilka andra sätt finns det att lösa problemet (i Java)?
spangoMedlem sedan juni 20008 205 inlägg En variant är "double dispatch"... dvs, du låter objektet som du inte vet vad det är bestämma vad som behöver göras. Antag att du har en klass Node som hanterar det som noder kan tänkas hantera (typ skicka vidare paket etc.) och en abstrakt klass/interface som heter Packet som typ HereAmIPacket, som meddelar var en nod är, NodeGroupPacket som meddelar vilka noder som är med i en grupp etc. Lösningen är då att ge Packet-klassen en metod som själv meddelar Noden om vad som ska göras:
abstract class Packet {
// ...
/** Får något att hända i noden */
public abstract void informNode(Node n);
}
...
class Node {
public void handleHereAmI(HereAmIPacket p){ ... }
public void handleNodeGroup(NodeGroupPacket p){ ... }
/**
* Får något att hända i noden (den viktiga biten).
* Anropas när ett paket anländer.
*/
public void packetArrived(Packet p){
p.informNode(this);
}
}
Sen gör du bara olika saker i subklasserna:
class HereAmIPacket extends Packet {
public void informNode(Node n){ n.handleHereAmI(this); }
}
class GroupPacket extends Packet {
public void informNode(Node n){ n.handleNodeGroup(this); }
}
Ger lite mer overhead (ytterst marginellt), men en betydligt renare design.
Det var en snygg lösning, den ska jag prova. Jag använder något liknande för att hantera mina olika events, men det går ju också att använda till paketen. Tack för hjälpen!