Interfaces con codigo especifico a la plataforma - jackgris/wikiLibGDX_es GitHub Wiki

4.7 Interfaces con código específico a la plataforma

He aquí hay un foro de debate sobre la cuestión, que también incluye cosas específicas de iOS.

A veces es necesario acceder a las APIs específicas de la plataforma, por ejemplo, añadiendo servicios de publicidad o funcionalidades proporcionadas por framework como Swarm.

Esto se puede lograr mediante la interacción de estas API con Facade, proporcionando una implementación específica de la plataforma para cada plataforma.

El siguiente ejemplo es pura ficción y asume que queremos utilizar un API muy simple de una tabla de clasificación que sólo está disponible en Android. Para las otras plataformas simplemente queremos loguear las invocaciones o proporcionar valores de retorno simulados (mocking).

La API de Android se ve así:

/** Let's assume this is the API provided by Swarm **/
public class LeaderboardServiceApi {
   public void submitScore(String user, int score) { ... }
}

El primer paso es crear una abstracción del API en forma de una interfaz.

La interfaz se coloca en el proyecto core (vea Crear, ejecutar, depurar y empaquetar su proyecto):

public interface Leaderboard {
   public void submitScore(String user, int score);
}

A continuación creamos las implementaciones concretas para cada plataforma y ponemos esto en sus respectivos proyectos.

Lo siguiente entraría en el proyecto Android:

/** Android implementation, can access LeaderboardServiceApi directly **/
public class AndroidLeaderboard implements Leaderboard {
   private final LeaderboardServiceApi service;

   public AndroidLeaderboard() {
      // Assuming we can instantiate it like this
      service = new LeaderboardServiceApi();
   }

   public void submitScore(String user, int score) {
      service.submitScore(user, score);
   }
}

Lo siguiente sería en el proyecto desktop:

/** Desktop implementation, we simply log invocations **/
public class DesktopLeaderboard implements Leaderboard {
   public void submitScore(String user, int score) {
      Gdx.app.log("DesktopLeaderboard", "would have submitted score for user " + user + ": " + score);
   }
}

El siguiente en el proyecto HTML5:

/** Html5 implementation, same as DesktopLeaderboard **/
public class Html5Leaderboard implements Leaderboard {
   public void submitScore(String user, int score) {
      Gdx.app.log("Html5Leaderboard", "would have submitted score for user " + user + ": " + score);
   }
}

A continuación, el ApplicationListener toma un constructor para que podamos pasar a la aplicación implementación concreta el Leaderboard:

public class MyGame implements ApplicationListener {
   private final Leaderboard leaderboard;

   public MyGame(Leaderboard leaderboard) {
      this.leaderboard = leaderboard;
   }

   // rest omitted for clarity
}

En cada clase de inicio que luego simplemente instanciamos en MyGame, pasando por la correspondiente implementación de Leaderboard como argumento, por ejemplo, en desktop:

public static void main(String[] argv) {
   LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
   new LwjglApplication(new MyGame(new DesktopLoaderboard()), config);
}

Enlaces