2014-12-18 2 views
2

Я пытаюсь понять шаблон моста. С примерами из Wiki все в порядке. Но что, если мы имеем следующую конструкцию:О модели моста снова

enter image description here

Как я могу реализовать различные пульты дистанционного управления (например, инфракрасные и Wi-Fi)? Должен ли я использовать шаблон Bridge и как это сделать? По аналогии с примерами мне нужно объединить все методы в один широкий интерфейс с аппаратной реализацией, как на следующем рисунке. Но я не думаю, что это хорошая идея.

enter image description here

ответ

1

Мост картина очень похож на шаблон адаптера.

После вашей модели, давайте предположим, что у вас есть 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(); 
+1

Благодарим вас за подробный ответ. Основной вопрос был связан с аппаратным интерфейсом. И вы правы, лучше использовать три интерфейса так же, как и вы. Он соответствует принципу разделения сегментов. – Vitaly

Смежные вопросы