Java设计模式 - 桥接模式
2017-12-23 本文已影响26人
a57ecf3aaaf2
定义
将抽象部分与其实现部分分离,使它们能够独立地进行变化。
桥接模式解决的问题就是实现与抽象之间的静态继成问题,当继承层次变得庞大时,这种问题尤其严重。“桥接”正是连接抽象部分与实现部分的桥梁,一定程度上减少子类的冗余,实现多维度解耦。
实现
通常,一个简单的继承的例子如下:
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_ 原创,未经许可,不得转载!