
// Many different implementations of it exist
interface PacketProtocol {
void sendPacket(Packet pp);
}
class FTP {
PacketProtocol pp;
public FTP(PacketProtocol pp) { this.pp = pp; }
public void setPacketProtocol(PacketProtocol pp) { this.pp = pp; }
public void sendFile(File file) {
List<Packet> packets = breakFileInPackets(File file);
for (Packet packet : packets) {
pp.sendPacket(packet);
}
}
}

abstract class FTP {
public void sendFile(File file) {
List<Packet> packets = breakFileInPackets(File file);
for (Packet packet : packets) {
sendPacket(packet);
}
}
public abstract void sendPacket(Packet packet);
}
class XModemFTP extends FTP {
public void sendPacket(Packet packet) {
...
}
}