Иногда бывает необходимо получить доступ к 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); }