Java设计模式 - 桥接模式

2018-03-01 11:03:36来源:https://www.jianshu.com/p/386099cc3b64作者:Fynn_人点击

分享


定义


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



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


实现

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


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_ 原创,未经许可,不得转载!








最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台