Java设计模式 - 桥接模式

定义

将抽象部分与其实现部分分离,使它们能够独立地进行变化。

桥接模式解决的问题就是实现与抽象之间的静态继成问题,当继承层次变得庞大时,这种问题尤其严重。“桥接”正是连接抽象部分与实现部分的桥梁,一定程度上减少子类的冗余,实现多维度解耦。

实现

通常,一个简单的继承的例子如下:

public interface Bird {
    void sing();
}
public class Sparrow implements Bird {

    @Override
    public void sing() {
        System.out.println("sparrow sing");
    }
}
public class Magpie extends Sparrow {

    @Override
    public void sing() {
        super.sing();
    }
}

这段代码看起来没有明显的困难,如果具体实现部分能够动态地扩展其方法,那岂不是更好,于是:

  public interface Bird {
  }
public abstract class Bridge {
    public abstract void sing();
    public abstract void fly();
}

public class AbsBird implements Bird {

    protected Bridge bridge;

    public AbsBird(Bridge bridge) {
        this.bridge = bridge;
    }

    public Bridge getBridge() {
        return bridge;
    }

    protected void sing() {
        bridge.sing();
    }
}
public class Sparrow extends AbsBird {

    public Sparrow(Bridge bridge) {
        super(bridge);
    }

    @Override
    protected void sing() {
        super.sing();
    }
}  
public class Magpie extends Sparrow {

    public Magpie(Bridge bridge) {
        super(bridge);
    }

    @Override
    protected void sing() {
        super.sing();
        bridge.fly();
    }
}

以上的 sing 方法调用了 Bridge 的 fly 方法,可动态扩展子类的行为。有盆友可能会问,直接在子类里实现具体的逻辑不就可以了。

那么,如果多个子类都需要实现这一段逻辑,且存在部分子类不需要实现这段逻辑的情况,直接在子类中直接实现逻辑就会导致相同的代码大量冗余。

来看看具体的客户端代码使用这种模式的妙处:


    public static void main(String[] args) {
        Magpie m = new Magpie(new Bridge() {
            @Override
            public void sing() {
                System.out.println("sing...");
            }

            @Override
            public void fly() {
                System.out.println("fly...");
            }
        });

        m.sing();

        Sparrow s = new Sparrow(new Bridge() {
            @Override
            public void sing() {
                System.out.println("super sing");
            }

            @Override
            public void fly() {
                System.out.println("super fly");
            }
        });

        s.sing();
    }
}

总结

桥接模式是一种非常巧妙的设计模式,它的优点显而易见,但是真正能够利用桥接模式达到优点最大化,还是需要不断地应用于实际项目,利用实际经验设计好桥接模式在业务中的使用。

本文由 Fynn_ 原创,未经许可,不得转载!

你可能感兴趣的:(Java设计模式 - 桥接模式)