Interfaces的概念应用于基于位置的应用程序

时间:2016-09-18 13:18:39

标签: java android interface location

我是java接口的新手,即使我理解了这个概念,已经看过很多例子并且知道它在某些情况下优于继承,因为它为你提供了更多的灵活性和更少的依赖。

在实践中,我第一次为Android构建基于位置的应用程序。我觉得我应该设计一些界面,以便将来可以放松我的工作,因为我假设我可能会再次构建其他基于位置的应用程序。

所以我一直在尝试为地图构建这个界面。目前,我一直在使用Mapbox平台而不是谷歌地图。我认为如果我想在将来使用Google Maps API,建立一个界面是一个好主意。

所以我做了这样的事情:

public interface Mapable {

    // Marker
    Object createMarker(String id, Location location, int icon);
    void addMarker(Object object);
    void removeMarker(String id);
    void moveMarker(String id, Location destination);

    // Camera
    Object createCamera();
    void addCamera(Object object);
    void changeZoom(int zoom);
    void setZoomRange(int min, int max);
    void moveCamera(Location location, int zoom);

    void updateElements();
}

所以,我相信我想要使用的平台无关紧要,我可以利用这个界面来了解我必须在Map类中实现哪些方法。

然而,感觉缺少某些东西,其设计或目的不正确。 这是使用接口的正确方法吗?

1 个答案:

答案 0 :(得分:1)

  

这是使用接口的正确方法吗?

是的!如果您像这样使用它,接口肯定会提供更大的灵活性。

  

感觉缺少某些东西,其设计或目的不正确。

也许您应该创建一个名为IMarker的界面和一个名为ICamera的界面,而不是使用Object作为标记和相机?

public interface IMarker {
    String getID();
    Location getLocation();
    @DrawableRes
    int getIcon(); // You can also return a Drawable instead, if you want

    // here you can add setters, but I don't think you need to
}

public interface ICamera {
    int getZoom();
    int getMinZoom();
    int getMaxZoom();
    Location getLocation();

    void setZoom(int value);
    void setZoomRange(int min, int max);
    void move(Location location, int zoom);
}

然后你可以像这样编写你的Mappable界面:

public interface Mapable {

    // Marker
    IMarker createMarker(String id, Location location, int icon);
    void addMarker(IMarker marker);
    void removeMarker(String id);
    void moveMarker(String id, Location destination);

    // Camera
    ICamera createCamera();
    void addCamera(ICamera camera);
    // Uncomment this line below if you want to be able to get all cameras
    // ICamera[] getCameras();
    // Uncomment this line below if you want to be able to get the current camera
    // ICamera getCurrentCamera();

    void updateElements();
}