Взаимодействие с кодом платформы

Иногда бывает необходимо получить доступ к API конкретной платформы, например добавление рекламных услуг или функциональность leaderboard, предоставляемая таким фреймворком как Swarm.

Это может быть достигнуто взаимодействием API с фасадом, предоставляя реализацию для конкретной платформы.

Следующий пример не является реальным и предполагает, что мы хотим использовать в libGDX приложении очень простой leaderboard API, который доступен только на Android. Для других платформы мы просто логируем вызов или возвращаем тестовое значение.

Android API выглядит следующим образом:

/** Давайте предположим, что это API предоставлено Swarm **/
public class LeaderboardServiceApi {
   public void submitScore(String user, int score) { ... }
}

Первым шагом является создание абстракции API в виде интерфейса.

Интерфейс нужно поместить в основной проект (смотрите настройку проекта)

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

Далее мы создадим конкретные реализации для каждой платформы и поместим их в соответствующие проекты.

Следующий код для Android проекта:

/** Android реализация, можно иметь доступ к LeaderboardServiceApi напрямую **/
public class AndroidLeaderboard implements Leaderboard {
   private final LeaderboardServiceApi service;

   public AndroidLeaderboard() {
      // Предположим можно создать экземпляр так:
      service = new LeaderboardServiceApi();
   }

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

Следующий код для Desktop проекта:

/** Desktop реализация, мы просто пишем сообщение в лог **/
public class DesktopLeaderboard implements Leaderboard {
   public void submitScore(String user, int score) {
      Gdx.app.log("DesktopLeaderboard", "would have submitted score for user " + user + ": " + score");
   }
}

Следующий код для HTML5 проекта:

/** Html5 реализация, какая же для DesktopLeaderboard **/
public class Html5Leaderboard implements Leaderboard {
   public void submitScore(String user, int score) {
      Gdx.app.log("DesktopLeaderboard", "would have submitted score for user " + user + ": " + score");
   }
}

Далее ApplicationListener получает конструктор, в который мы может передать конкретную реализацию Leaderboard:

public class MyGame implements ApplicationListener {
   private final Leaderboard leaderboard;

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

   // остальное опущены для ясности
}

В каждом Starter классе мы просто создаем экземпляр MyGame, передавая как агрумент соответствующею Leaderboard реализацию, например для Desktop проекта:

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