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