桥模式就是将抽象与其实现解耦,使他们可以分别独立的变化,这里所说的实现并不是我们所了解的派生类对抽象类的实现,桥模式中的抽象指的是抽象类及派生类,实现指的是这些抽象类及派生类实现自己的方式。桥模式也是继承关系的一种替代实现。
我们来看一个汽车制造商制造汽车的例子,先抽象出汽车模型:
package com.dxy.design.pattern.bridge;
public abstract class Car {
public void produce() {
}
}
货车类:
package com.dxy.design.pattern.bridge;
public class Truk extends Car {
@Override
public void produce() {
}
}
公共汽车类:
package com.dxy.design.pattern.bridge;
public class Bus extends Car {
@Override
public void produce() {
}
}
接着我们让汽车制造商制造汽车:
制造商1制造货车:
package com.dxy.design.pattern.bridge;
public class FawTruk extends Truk {
@Override
public void produce() {
}
}
制造商1制造公共汽车:
package com.dxy.design.pattern.bridge;
public class FawBus extends Truk {
@Override
public void produce() {
}
}
这时我们想一下,如果要制造更多的不同种类的车,而不同种类的车又有不同的制造商去制造,这又回到坑爹的多重继承里了,这时我们可以通过桥模式将汽车模型的抽象和它的实现解耦合,也就是把车型看做桥模式中的抽象,将制造商看做是桥模式中的实现,就可以避免多重继承了,抽象的汽车类:
package com.dxy.design.pattern.bridge;
public abstract class Car {
public ManuFacturer mf;
//将制造商作为参数
public Car(ManuFacturer mf) {
this.mf = mf;
}
public void produce() {
}
}
货车类:
package com.dxy.design.pattern.bridge;
public class Truk extends Car {
public Truk(ManuFacturer mf) {
super(mf);
}
@Override
public void produce() {
mf.produce();
}
}
公共汽车类:
package com.dxy.design.pattern.bridge;
public class Bus extends Car {
public Bus(ManuFacturer mf) {
super(mf);
}
@Override
public void produce() {
mf.produce();
}
}
制造商接口:
package com.dxy.design.pattern.bridge;
public interface ManuFacturer {
public void produce() ;
}
制造商1:
package com.dxy.design.pattern.bridge;
public class FawTruk implements ManuFacturer {
@Override
public void produce() {
System.out.println("制造商1制造");
}
}
制造商2:
package com.dxy.design.pattern.bridge;
public class FawBus implements ManuFacturer {
@Override
public void produce() {
System.out.println("制造商2制造");
}
}
这时我们就可以在客户端将各种汽车和各种制造商任意的组合来避免多重继承的发生,客户端调用:
package com.dxy.design.pattern.bridge;
public class Client {
public static void main(String[] args) {
//制造商1制造的火车
Car car = new Truk(new FawTruk());
car.produce();
Car car1 = new Bus(new FawBus()) ;
car1.produce();
}
}
使用Bridge模式,能够提供比使用继承关系更灵活的功能,他可以使抽象和实现分开,降低了耦合关系,当有新的抽象和实现方式是,只需要继承一个抽象和继承一个实现即可。