如何使用接口通信两个组件?
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);
}
我正在开发一个基于组件的软件,我有两个相互通信的组件。我有一个管理预订流程的 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);
}