如何使用接口通信两个组件?

How to communicate two components using interfaces?

我正在开发一个基于组件的软件,我有两个相互通信的组件。我有一个管理预订流程的 Reservation Component 和一个管理度假村详细信息(可用房间、房间详细信息、客户等)的 Resort Component ). Reservation Component 有一个 IReservation 接口,Resort Component 有一个 IResort界面。接口如下所示。

IReservation

public interface IReservation{

    void makeReservation(Client c);
    RoomDetails getRoomDetails(int roomNumber);
}

IResort

public interface IResort{

    RoomDetails getRoomDetails(int roomNumber);
}

请注意,两个接口具有相同的方法 getRoomDetails

我希望当Reservation组件需要获取房间详细信息时,IReservation接口将调用传递给Resort Component通过IResort接口,所以Resort Component可以执行de getRoomDetails 和 return 房间详细信息通过 IReservation 接口发送到 Reservation Component。 那么我怎样才能让 Reservation Component 将调用传递给 Resort Component 并从中获取房间详细信息?

一个接口不能将调用传递给另一个接口 - 只有具体的实现才能做到这一点。

当您创建 Reservation 组件(实现 IReservation)时,在构造函数中或通过 setter 方法将对 Resort 组件(实现 IResort)的引用传递给它。

然后,当它需要房间详细信息时,只需从您的 Reservation 组件调用 IResort 组件的 .getRoomDetails() 方法。

(假设您确实需要 IReservation 和 IResort 的单独组件,并且您希望按照描述保留这两个接口;例如,您可以使用相同的 class 实现这两个接口,或者创建一个新接口来保存 getRoomDetails,如 Krab 的评论中所述)

如果您愿意放弃两者都必须是接口的条件,您可以通过将 IReservation 声明为抽象来强制执行您的条件 class:

// implements is not necessarily needed, but here it does fit since each
// Reservation is bound to an IResort
public abstract class AReservation implements IResort {

    IResort resort;

    public AReservation(IResort resort) {
        this.resort = resort;
    }

    abstract public void makeReservation(Client c);

    // forward getRoomDetails to resort's getRoomDetail,
    // make method final to prevent overriding.
    public final RoomDetails getRoomDetails(int roomNumber) {
        return this.resort.getRoomDetails(roomNumber);
    }
}

public interface IResort {

    public RoomDetails getRoomDetails(int roomNumber);
}