Bridge Pattern in Java

Design Patterns in Java (4 Part Series)

1 Strategy Design Pattern in Java
2 Template Method Pattern in Java
3 Factory Method in Java
4 Bridge Pattern in Java

The Bridge Pattern is a structural design pattern that helps decouple abstraction from implementation, allowing them to evolve independently.

This is particularly useful when dealing with multiple dimensions of variability in our system. Instead of having a complex hierarchy of subclasses, we use composition to separate concerns, making our code more maintainable and scalable.

In this post, we’ll explore the Bridge Pattern using an easy-to-understand example with different devices and remote controls.


Why Use the Bridge Pattern?

Reduces Class Explosion – Avoids deep inheritance trees when dealing with multiple variations.

Promotes Composition Over Inheritance – Favors flexibility by allowing independent changes to abstraction and implementation.

Improves Maintainability – Enhances readability and separation of concerns.


Problem Without the Bridge Pattern

Imagine we have different types of devices (like TV and Radio) and different remote controls (like Basic Remote and Advanced Remote).

A bad approach would be using inheritance to create a subclass for each combination, like:

  • BasicTVRemote
  • AdvancedTVRemote
  • BasicRadioRemote
  • AdvancedRadioRemote

As we add more device types or remote types, our class hierarchy grows exponentially!

Example Without the Bridge Pattern (Using Inheritance)

<span>// Parent class for all remotes</span>
<span>public</span> <span>abstract</span> <span>class</span> <span>Remote</span> <span>{</span>
<span>public</span> <span>abstract</span> <span>void</span> <span>turnOn</span><span>();</span>
<span>public</span> <span>abstract</span> <span>void</span> <span>turnOff</span><span>();</span>
<span>}</span>
<span>// Concrete class for Basic TV Remote</span>
<span>public</span> <span>class</span> <span>BasicTVRemote</span> <span>extends</span> <span>Remote</span> <span>{</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>turnOn</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Turning on the TV."</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>turnOff</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Turning off the TV."</span><span>);</span>
<span>}</span>
<span>}</span>
<span>// Concrete class for Advanced TV Remote</span>
<span>public</span> <span>class</span> <span>AdvancedTVRemote</span> <span>extends</span> <span>BasicTVRemote</span> <span>{</span>
<span>public</span> <span>void</span> <span>mute</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Muting the TV."</span><span>);</span>
<span>}</span>
<span>}</span>
<span>// Concrete class for Basic Radio Remote</span>
<span>public</span> <span>class</span> <span>BasicRadioRemote</span> <span>extends</span> <span>Remote</span> <span>{</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>turnOn</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Turning on the Radio."</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>turnOff</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Turning off the Radio."</span><span>);</span>
<span>}</span>
<span>}</span>
<span>// Concrete class for Advanced Radio Remote</span>
<span>public</span> <span>class</span> <span>AdvancedRadioRemote</span> <span>extends</span> <span>BasicRadioRemote</span> <span>{</span>
<span>public</span> <span>void</span> <span>mute</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Muting the Radio."</span><span>);</span>
<span>}</span>
<span>}</span>
<span>// Main class</span>
<span>public</span> <span>class</span> <span>WithoutBridgeExample</span> <span>{</span>
<span>public</span> <span>static</span> <span>void</span> <span>main</span><span>(</span><span>String</span><span>[]</span> <span>args</span><span>)</span> <span>{</span>
<span>BasicTVRemote</span> <span>basicTV</span> <span>=</span> <span>new</span> <span>BasicTVRemote</span><span>();</span>
<span>AdvancedTVRemote</span> <span>advancedTV</span> <span>=</span> <span>new</span> <span>AdvancedTVRemote</span><span>();</span>
<span>BasicRadioRemote</span> <span>basicRadio</span> <span>=</span> <span>new</span> <span>BasicRadioRemote</span><span>();</span>
<span>AdvancedRadioRemote</span> <span>advancedRadio</span> <span>=</span> <span>new</span> <span>AdvancedRadioRemote</span><span>();</span>
<span>basicTV</span><span>.</span><span>turnOn</span><span>();</span>
<span>advancedTV</span><span>.</span><span>mute</span><span>();</span>
<span>basicRadio</span><span>.</span><span>turnOff</span><span>();</span>
<span>advancedRadio</span><span>.</span><span>mute</span><span>();</span>
<span>}</span>
<span>}</span>
<span>// Parent class for all remotes</span>
<span>public</span> <span>abstract</span> <span>class</span> <span>Remote</span> <span>{</span>
    <span>public</span> <span>abstract</span> <span>void</span> <span>turnOn</span><span>();</span>
    <span>public</span> <span>abstract</span> <span>void</span> <span>turnOff</span><span>();</span>
<span>}</span>

<span>// Concrete class for Basic TV Remote</span>
<span>public</span> <span>class</span> <span>BasicTVRemote</span> <span>extends</span> <span>Remote</span> <span>{</span>
    <span>@Override</span>
    <span>public</span> <span>void</span> <span>turnOn</span><span>()</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Turning on the TV."</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>turnOff</span><span>()</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Turning off the TV."</span><span>);</span>
    <span>}</span>
<span>}</span>

<span>// Concrete class for Advanced TV Remote</span>
<span>public</span> <span>class</span> <span>AdvancedTVRemote</span> <span>extends</span> <span>BasicTVRemote</span> <span>{</span>
    <span>public</span> <span>void</span> <span>mute</span><span>()</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Muting the TV."</span><span>);</span>
    <span>}</span>
<span>}</span>

<span>// Concrete class for Basic Radio Remote</span>
<span>public</span> <span>class</span> <span>BasicRadioRemote</span> <span>extends</span> <span>Remote</span> <span>{</span>
    <span>@Override</span>
    <span>public</span> <span>void</span> <span>turnOn</span><span>()</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Turning on the Radio."</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>turnOff</span><span>()</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Turning off the Radio."</span><span>);</span>
    <span>}</span>
<span>}</span>

<span>// Concrete class for Advanced Radio Remote</span>
<span>public</span> <span>class</span> <span>AdvancedRadioRemote</span> <span>extends</span> <span>BasicRadioRemote</span> <span>{</span>
    <span>public</span> <span>void</span> <span>mute</span><span>()</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Muting the Radio."</span><span>);</span>
    <span>}</span>
<span>}</span>

<span>// Main class</span>
<span>public</span> <span>class</span> <span>WithoutBridgeExample</span> <span>{</span>
    <span>public</span> <span>static</span> <span>void</span> <span>main</span><span>(</span><span>String</span><span>[]</span> <span>args</span><span>)</span> <span>{</span>
        <span>BasicTVRemote</span> <span>basicTV</span> <span>=</span> <span>new</span> <span>BasicTVRemote</span><span>();</span>
        <span>AdvancedTVRemote</span> <span>advancedTV</span> <span>=</span> <span>new</span> <span>AdvancedTVRemote</span><span>();</span>
        <span>BasicRadioRemote</span> <span>basicRadio</span> <span>=</span> <span>new</span> <span>BasicRadioRemote</span><span>();</span>
        <span>AdvancedRadioRemote</span> <span>advancedRadio</span> <span>=</span> <span>new</span> <span>AdvancedRadioRemote</span><span>();</span>

        <span>basicTV</span><span>.</span><span>turnOn</span><span>();</span>
        <span>advancedTV</span><span>.</span><span>mute</span><span>();</span>
        <span>basicRadio</span><span>.</span><span>turnOff</span><span>();</span>
        <span>advancedRadio</span><span>.</span><span>mute</span><span>();</span>
    <span>}</span>
<span>}</span>
// Parent class for all remotes public abstract class Remote { public abstract void turnOn(); public abstract void turnOff(); } // Concrete class for Basic TV Remote public class BasicTVRemote extends Remote { @Override public void turnOn() { System.out.println("Turning on the TV."); } @Override public void turnOff() { System.out.println("Turning off the TV."); } } // Concrete class for Advanced TV Remote public class AdvancedTVRemote extends BasicTVRemote { public void mute() { System.out.println("Muting the TV."); } } // Concrete class for Basic Radio Remote public class BasicRadioRemote extends Remote { @Override public void turnOn() { System.out.println("Turning on the Radio."); } @Override public void turnOff() { System.out.println("Turning off the Radio."); } } // Concrete class for Advanced Radio Remote public class AdvancedRadioRemote extends BasicRadioRemote { public void mute() { System.out.println("Muting the Radio."); } } // Main class public class WithoutBridgeExample { public static void main(String[] args) { BasicTVRemote basicTV = new BasicTVRemote(); AdvancedTVRemote advancedTV = new AdvancedTVRemote(); BasicRadioRemote basicRadio = new BasicRadioRemote(); AdvancedRadioRemote advancedRadio = new AdvancedRadioRemote(); basicTV.turnOn(); advancedTV.mute(); basicRadio.turnOff(); advancedRadio.mute(); } }

Enter fullscreen mode Exit fullscreen mode

Problems with This Approach

Class Explosion – Every new remote type requires new subclasses.

Hard to Maintain – Changes in the Remote logic require modifications in multiple classes.

Tight Coupling – Device behavior is tightly linked to Remote behavior.


Solution: Using the Bridge Pattern

Instead of relying on inheritance, we use composition:

  • We separate Devices (TV, Radio, etc.) from Remotes (Basic, Advanced, etc.).
  • Remotes hold a reference to a Device, allowing independent variations.

Step 1: Create the Device Interface

Each device must implement basic functionalities like turning on/off and changing volume.

<span>public</span> <span>interface</span> <span>Device</span> <span>{</span>
<span>void</span> <span>turnOn</span><span>();</span>
<span>void</span> <span>turnOff</span><span>();</span>
<span>void</span> <span>setVolume</span><span>(</span><span>int</span> <span>volume</span><span>);</span>
<span>boolean</span> <span>isOn</span><span>();</span>
<span>}</span>
<span>public</span> <span>interface</span> <span>Device</span> <span>{</span>
    <span>void</span> <span>turnOn</span><span>();</span>
    <span>void</span> <span>turnOff</span><span>();</span>
    <span>void</span> <span>setVolume</span><span>(</span><span>int</span> <span>volume</span><span>);</span>
    <span>boolean</span> <span>isOn</span><span>();</span>
<span>}</span>
public interface Device { void turnOn(); void turnOff(); void setVolume(int volume); boolean isOn(); }

Enter fullscreen mode Exit fullscreen mode


Step 2: Implement Different Devices (TV and Radio)

<span>public</span> <span>class</span> <span>TV</span> <span>implements</span> <span>Device</span> <span>{</span>
<span>private</span> <span>boolean</span> <span>on</span> <span>=</span> <span>false</span><span>;</span>
<span>private</span> <span>int</span> <span>volume</span> <span>=</span> <span>50</span><span>;</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>turnOn</span><span>()</span> <span>{</span>
<span>on</span> <span>=</span> <span>true</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"TV is now ON"</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>turnOff</span><span>()</span> <span>{</span>
<span>on</span> <span>=</span> <span>false</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"TV is now OFF"</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setVolume</span><span>(</span><span>int</span> <span>volume</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>volume</span> <span>=</span> <span>volume</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"TV volume set to "</span> <span>+</span> <span>volume</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>boolean</span> <span>isOn</span><span>()</span> <span>{</span>
<span>return</span> <span>on</span><span>;</span>
<span>}</span>
<span>}</span>
<span>public</span> <span>class</span> <span>Radio</span> <span>implements</span> <span>Device</span> <span>{</span>
<span>private</span> <span>boolean</span> <span>on</span> <span>=</span> <span>false</span><span>;</span>
<span>private</span> <span>int</span> <span>volume</span> <span>=</span> <span>30</span><span>;</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>turnOn</span><span>()</span> <span>{</span>
<span>on</span> <span>=</span> <span>true</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Radio is now ON"</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>turnOff</span><span>()</span> <span>{</span>
<span>on</span> <span>=</span> <span>false</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Radio is now OFF"</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setVolume</span><span>(</span><span>int</span> <span>volume</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>volume</span> <span>=</span> <span>volume</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Radio volume set to "</span> <span>+</span> <span>volume</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>boolean</span> <span>isOn</span><span>()</span> <span>{</span>
<span>return</span> <span>on</span><span>;</span>
<span>}</span>
<span>}</span>
<span>public</span> <span>class</span> <span>TV</span> <span>implements</span> <span>Device</span> <span>{</span>
    <span>private</span> <span>boolean</span> <span>on</span> <span>=</span> <span>false</span><span>;</span>
    <span>private</span> <span>int</span> <span>volume</span> <span>=</span> <span>50</span><span>;</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>turnOn</span><span>()</span> <span>{</span>
        <span>on</span> <span>=</span> <span>true</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"TV is now ON"</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>turnOff</span><span>()</span> <span>{</span>
        <span>on</span> <span>=</span> <span>false</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"TV is now OFF"</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setVolume</span><span>(</span><span>int</span> <span>volume</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>volume</span> <span>=</span> <span>volume</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"TV volume set to "</span> <span>+</span> <span>volume</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>boolean</span> <span>isOn</span><span>()</span> <span>{</span>
        <span>return</span> <span>on</span><span>;</span>
    <span>}</span>
<span>}</span>

<span>public</span> <span>class</span> <span>Radio</span> <span>implements</span> <span>Device</span> <span>{</span>
    <span>private</span> <span>boolean</span> <span>on</span> <span>=</span> <span>false</span><span>;</span>
    <span>private</span> <span>int</span> <span>volume</span> <span>=</span> <span>30</span><span>;</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>turnOn</span><span>()</span> <span>{</span>
        <span>on</span> <span>=</span> <span>true</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Radio is now ON"</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>turnOff</span><span>()</span> <span>{</span>
        <span>on</span> <span>=</span> <span>false</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Radio is now OFF"</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setVolume</span><span>(</span><span>int</span> <span>volume</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>volume</span> <span>=</span> <span>volume</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Radio volume set to "</span> <span>+</span> <span>volume</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>boolean</span> <span>isOn</span><span>()</span> <span>{</span>
        <span>return</span> <span>on</span><span>;</span>
    <span>}</span>
<span>}</span>
public class TV implements Device { private boolean on = false; private int volume = 50; @Override public void turnOn() { on = true; System.out.println("TV is now ON"); } @Override public void turnOff() { on = false; System.out.println("TV is now OFF"); } @Override public void setVolume(int volume) { this.volume = volume; System.out.println("TV volume set to " + volume); } @Override public boolean isOn() { return on; } } public class Radio implements Device { private boolean on = false; private int volume = 30; @Override public void turnOn() { on = true; System.out.println("Radio is now ON"); } @Override public void turnOff() { on = false; System.out.println("Radio is now OFF"); } @Override public void setVolume(int volume) { this.volume = volume; System.out.println("Radio volume set to " + volume); } @Override public boolean isOn() { return on; } }

Enter fullscreen mode Exit fullscreen mode


Step 3: Create the Remote Control Abstraction

Now, we define an abstract class RemoteControl, which uses composition to interact with a Device.

<span>public</span> <span>class</span> <span>RemoteControl</span> <span>{</span>
<span>protected</span> <span>Device</span> <span>device</span><span>;</span>
<span>public</span> <span>RemoteControl</span><span>(</span><span>Device</span> <span>device</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>device</span> <span>=</span> <span>device</span><span>;</span>
<span>}</span>
<span>public</span> <span>void</span> <span>togglePower</span><span>()</span> <span>{</span>
<span>if</span> <span>(</span><span>device</span><span>.</span><span>isOn</span><span>())</span> <span>{</span>
<span>device</span><span>.</span><span>turnOff</span><span>();</span>
<span>}</span> <span>else</span> <span>{</span>
<span>device</span><span>.</span><span>turnOn</span><span>();</span>
<span>}</span>
<span>}</span>
<span>public</span> <span>void</span> <span>volumeUp</span><span>()</span> <span>{</span>
<span>device</span><span>.</span><span>setVolume</span><span>(</span><span>50</span><span>);</span>
<span>}</span>
<span>public</span> <span>void</span> <span>volumeDown</span><span>()</span> <span>{</span>
<span>device</span><span>.</span><span>setVolume</span><span>(</span><span>10</span><span>);</span>
<span>}</span>
<span>}</span>
<span>public</span> <span>class</span> <span>RemoteControl</span> <span>{</span>
    <span>protected</span> <span>Device</span> <span>device</span><span>;</span>

    <span>public</span> <span>RemoteControl</span><span>(</span><span>Device</span> <span>device</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>device</span> <span>=</span> <span>device</span><span>;</span>
    <span>}</span>

    <span>public</span> <span>void</span> <span>togglePower</span><span>()</span> <span>{</span>
        <span>if</span> <span>(</span><span>device</span><span>.</span><span>isOn</span><span>())</span> <span>{</span>
            <span>device</span><span>.</span><span>turnOff</span><span>();</span>
        <span>}</span> <span>else</span> <span>{</span>
            <span>device</span><span>.</span><span>turnOn</span><span>();</span>
        <span>}</span>
    <span>}</span>

    <span>public</span> <span>void</span> <span>volumeUp</span><span>()</span> <span>{</span>
        <span>device</span><span>.</span><span>setVolume</span><span>(</span><span>50</span><span>);</span>
    <span>}</span>

    <span>public</span> <span>void</span> <span>volumeDown</span><span>()</span> <span>{</span>
        <span>device</span><span>.</span><span>setVolume</span><span>(</span><span>10</span><span>);</span>
    <span>}</span>
<span>}</span>
public class RemoteControl { protected Device device; public RemoteControl(Device device) { this.device = device; } public void togglePower() { if (device.isOn()) { device.turnOff(); } else { device.turnOn(); } } public void volumeUp() { device.setVolume(50); } public void volumeDown() { device.setVolume(10); } }

Enter fullscreen mode Exit fullscreen mode


Step 4: Extend the Remote Control with More Functionality

Let’s create an Advanced Remote that can also mute the device.

<span>public</span> <span>class</span> <span>AdvancedRemoteControl</span> <span>extends</span> <span>RemoteControl</span> <span>{</span>
<span>public</span> <span>AdvancedRemoteControl</span><span>(</span><span>Device</span> <span>device</span><span>)</span> <span>{</span>
<span>super</span><span>(</span><span>device</span><span>);</span>
<span>}</span>
<span>public</span> <span>void</span> <span>mute</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Muting the device"</span><span>);</span>
<span>device</span><span>.</span><span>setVolume</span><span>(</span><span>0</span><span>);</span>
<span>}</span>
<span>}</span>
<span>public</span> <span>class</span> <span>AdvancedRemoteControl</span> <span>extends</span> <span>RemoteControl</span> <span>{</span>

    <span>public</span> <span>AdvancedRemoteControl</span><span>(</span><span>Device</span> <span>device</span><span>)</span> <span>{</span>
        <span>super</span><span>(</span><span>device</span><span>);</span>
    <span>}</span>

    <span>public</span> <span>void</span> <span>mute</span><span>()</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Muting the device"</span><span>);</span>
        <span>device</span><span>.</span><span>setVolume</span><span>(</span><span>0</span><span>);</span>
    <span>}</span>
<span>}</span>
public class AdvancedRemoteControl extends RemoteControl { public AdvancedRemoteControl(Device device) { super(device); } public void mute() { System.out.println("Muting the device"); device.setVolume(0); } }

Enter fullscreen mode Exit fullscreen mode


Step 5: Using the Bridge Pattern in the Main Program

<span>public</span> <span>class</span> <span>BridgePatternExample</span> <span>{</span>
<span>public</span> <span>static</span> <span>void</span> <span>main</span><span>(</span><span>String</span><span>[]</span> <span>args</span><span>)</span> <span>{</span>
<span>Device</span> <span>tv</span> <span>=</span> <span>new</span> <span>TV</span><span>();</span>
<span>Device</span> <span>radio</span> <span>=</span> <span>new</span> <span>Radio</span><span>();</span>
<span>RemoteControl</span> <span>basicRemote</span> <span>=</span> <span>new</span> <span>RemoteControl</span><span>(</span><span>tv</span><span>);</span>
<span>AdvancedRemoteControl</span> <span>advancedRemote</span> <span>=</span> <span>new</span> <span>AdvancedRemoteControl</span><span>(</span><span>radio</span><span>);</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Using Basic Remote with TV:"</span><span>);</span>
<span>basicRemote</span><span>.</span><span>togglePower</span><span>();</span>
<span>basicRemote</span><span>.</span><span>volumeUp</span><span>();</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"\nUsing Advanced Remote with Radio:"</span><span>);</span>
<span>advancedRemote</span><span>.</span><span>togglePower</span><span>();</span>
<span>advancedRemote</span><span>.</span><span>mute</span><span>();</span>
<span>}</span>
<span>}</span>
<span>public</span> <span>class</span> <span>BridgePatternExample</span> <span>{</span>
    <span>public</span> <span>static</span> <span>void</span> <span>main</span><span>(</span><span>String</span><span>[]</span> <span>args</span><span>)</span> <span>{</span>
        <span>Device</span> <span>tv</span> <span>=</span> <span>new</span> <span>TV</span><span>();</span>
        <span>Device</span> <span>radio</span> <span>=</span> <span>new</span> <span>Radio</span><span>();</span>

        <span>RemoteControl</span> <span>basicRemote</span> <span>=</span> <span>new</span> <span>RemoteControl</span><span>(</span><span>tv</span><span>);</span>
        <span>AdvancedRemoteControl</span> <span>advancedRemote</span> <span>=</span> <span>new</span> <span>AdvancedRemoteControl</span><span>(</span><span>radio</span><span>);</span>

        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Using Basic Remote with TV:"</span><span>);</span>
        <span>basicRemote</span><span>.</span><span>togglePower</span><span>();</span>
        <span>basicRemote</span><span>.</span><span>volumeUp</span><span>();</span>

        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"\nUsing Advanced Remote with Radio:"</span><span>);</span>
        <span>advancedRemote</span><span>.</span><span>togglePower</span><span>();</span>
        <span>advancedRemote</span><span>.</span><span>mute</span><span>();</span>
    <span>}</span>
<span>}</span>
public class BridgePatternExample { public static void main(String[] args) { Device tv = new TV(); Device radio = new Radio(); RemoteControl basicRemote = new RemoteControl(tv); AdvancedRemoteControl advancedRemote = new AdvancedRemoteControl(radio); System.out.println("Using Basic Remote with TV:"); basicRemote.togglePower(); basicRemote.volumeUp(); System.out.println("\nUsing Advanced Remote with Radio:"); advancedRemote.togglePower(); advancedRemote.mute(); } }

Enter fullscreen mode Exit fullscreen mode


Pros of the Bridge Pattern

Decouples abstraction from implementation – Devices and Remotes can evolve separately.

Improves Maintainability – Changes in one part of the code don’t affect the other.

Promotes Code Reusability – You can mix and match different implementations.


Conclusion

The Bridge Pattern is a great solution when you have multiple variations of both abstractions and implementations. By using composition over inheritance, we gain flexibility, scalability, and better code organization.


Reference

Project Repository

Talk to me

Design Patterns in Java (4 Part Series)

1 Strategy Design Pattern in Java
2 Template Method Pattern in Java
3 Factory Method in Java
4 Bridge Pattern in Java

原文链接:Bridge Pattern in Java

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
Those who fly solo have the strongest wings.
那些单独飞翔的人拥有最强大的翅膀
评论 抢沙发

请登录后发表评论

    暂无评论内容