Мост картина очень похож на шаблон адаптера.
После вашей модели, давайте предположим, что у вас есть RemoteControl
абстрактный класс:
public abstract class RemoteControl
{
protected HadwareRemoteControl hardwareBridge;
//Can be injected using DI
public RemoteControl(HadwareRemoteControl hardwareBridge)
{
this.hardwareBridge= hardwareBridge;
}
public void on()
{
hardwareBridge.on();
}
public void off()
{
hardwareBridge.off();
}
}
И две реализации для этого класса:
public class TVRemoteControl extends RemoteControl
{
public TVRemoteControl(TVHardwareRemoteControl hardwareBridge) {
super(hardwareBridge);
}
public void nextChannel() {
((TVHardwareRemoteControl)hardwareBridge).nextChannel();
}
public void previousChannel() {
((TVHardwareRemoteControl)hardwareBridge).previousChannel();
}
}
public class ModelRemoteControl extends RemoteControl
{
public ModelRemoteControl (ModelHardwareRemoteControl hardwareBridge) {
super(hardwareBridge);
}
public void moveForward() {
((ModelHardwareRemoteControl)hardwareBridge).moveForward();
}
public void moveBack() {
((ModelHardwareRemoteControl)hardwareBridge).moveBack();
}
}
Теперь для аппаратного моста, у нас есть базовый интерфейс :
public interface HadwareRemoteControl
{
public void on();
public void off();
}
И еще два интерфейса:
public interface TVHadwareRemoteControl extends HardwareRemoteControl
{
public void nextChannel();
public void previousChannel();
}
public interface ModelHardwareRemoteControl extends HardwareRemoteControl
{
public void moveForward();
public void moveBack();
}
И, как в вашем Desing, две реализации:
public class InfraredRemoteControl implements TVHardwareRemoteControl, ModelHardwareRemoteControl
{
public void on()
{
//Hardware Turn on
}
public void off()
{
//Hardware Turn off
}
public void nextChannel()
{
//Hardware Next channel
}
public void previousChannel()
{
//Hardware Previous channel
}
public void moveForward()
{
//Hardware Move Forward
}
public void moveBack()
{
//Hardware Move Back
}
}
public class WifiRemoteControl implements TVHardwareRemoteControl, ModelHardwareRemoteControl
{
public void on()
{
//Hardware Turn on
}
public void off()
{
//Hardware Turn off
}
public void nextChannel()
{
//Hardware Next channel
}
public void previousChannel()
{
//Hardware Previous channel
}
public void moveForward()
{
//Hardware Move Forward
}
public void moveBack()
{
//Hardware Move Back
}
}
От внешнего проекта, клиент вашего API может использовать аппаратное обеспечение более прозрачно, даже не знают об этих реализациях:
TVRemoteControl tvRemote = Factory.CreateTVRemote();
//Depending on the injected hardware implementation, it may call InfraredRemoteControl or WifiRemoteControl
tvRemote.on();
tvRemote.nextChannel();
Благодарим вас за подробный ответ. Основной вопрос был связан с аппаратным интерфейсом. И вы правы, лучше использовать три интерфейса так же, как и вы. Он соответствует принципу разделения сегментов. – Vitaly