【问题标题】:About the Bridge pattern again再次关于 Bridge 模式
【发布时间】:2014-12-18 10:07:46
【问题描述】:

我正在尝试理解桥接模式。使用 Wiki 中的示例,一切正常。 但是如果我们有下一个设计呢:

如何实现不同的遥控器(例如红外线和 Wi-Fi)?我应该使用桥接模式以及如何使用?通过类比示例,我需要将所有方法与单个宽接口与硬件实现相结合,如下图所示。但我认为这不是一个好主意。

【问题讨论】:

    标签: design-patterns bridge


    【解决方案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();
    }
    

    而且,就像在您的设计中一样,有两个实现:

    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();
    

    【讨论】:

    • 感谢您的详细回复。主要问题与硬件接口有关。你是对的,最好像你一样使用三个接口。符合接口隔离原则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2011-01-21
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多