在我当前的项目中,我有一个相当时髦的设备,它可以执行各种流式传输选项,例如视频流式传输、音频流式传输和某些类型的数据流式传输。
每个设备仅支持有限数量的这些流中的每一个。为了论证起见,假设它可以支持 2 个视频流和 1 个音频流。
我设计的有点像下面。(大多数应用程序逻辑都被忽略了。)
public class FunkyDevice
{
int openVideoStreams;
int openAudioStreams;
public VideoStream openVideoStream(int id)
{
if (openVideoStreams < 2)
{
openVideoStreams++;
return new VideoStream(...);
}
}
public AudioStream openAudioStream(int id)
{
if (openAudioStreams < 1)
{
openAudioStreams++;
return new AudioStream(...);
}
}
}
但是,现在我需要支持超过 1 个设备。我将这些分组在一个用户会话中。每个用户会话也限制了每个流的数量,但是这些数字当然与设备限制不同(否则问题就太容易了)。例如,我可以有 3 个视频流(到 1、2 或 3 个不同的设备)和仍然 1 个音频流。
我处理这个问题的最佳尝试如下:
public class UserSession
{
int openVideoStreams;
int openAudioStreams;
public VideoStream openVideoStream(int deviceId, int id)
{
if (openVideoStreams < 3)
{
openVideoStreams++;
return getDevice(deviceId).openVideoStream(id);
}
}
public AudioStream openAudioStream(int deviceId, int id)
{
if (openAudioStreams < 1)
{
openAudioStreams++;
return getDevice(deviceId).openAudioStream(id);
}
}
}
如您所见, 和 的公共接口FunkyDevice
几乎UserSession
相同,只是其中的每个方法UserSession
都有一个附加参数deviceId
。在我的实际应用程序中,我有超过 2 种不同类型的流(并且还希望执行其他操作,例如关闭流),因此接口变得非常大。
在不引入此代码重复的情况下,是否有更好的模式来促进这一点?