创建桥接实现接口。
public interface DrawAPI {
public void drawCircle(int radius, int x, int y);
}
创建实现了 DrawAPI 接口的实体桥接实现类。
public class GreenCircle implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("Drawing Circle[ color: green, radius: "
+ radius + ", x: " + x + ", " + y + "]");
}
}
public class RedCircle implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("Drawing Circle[ color: red, radius: "
+ radius + ", x: " + x + ", " + y + "]");
}
}
使用 DrawAPI 接口创建抽象类 Shape。
public abstract class Shape {
protected DrawAPI drawAPI;
protected Shape(DrawAPI drawAPI) {
this.drawAPI = drawAPI;
}
public abstract void draw();
}
创建实现了 Shape 抽象类的实体类。
public class Circle extends Shape {
private int x, y, radius;
public Circle(int x, int y, int radius, DrawAPI drawAPI) {
super(drawAPI);
this.x = x;
this.y = y;
this.radius = radius;
}
public void draw() {
drawAPI.drawCircle(radius, x, y);
}
}
使用 Shape 和 DrawAPI 类画出不同颜色的圆。
/*
1 将抽象部分与实现部分分离,使它们都可以独立的变化。
2 在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
使用场景: 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。
<p>
总结:
Shape【抽象部分】: 抽象类,
1 对子类开放个构造方法,构造时,需初始化成员变量 DrawAPI 【接口,用它来扩展】。
Circle【实现部分,桥接的实现者】: 实现类,
1 对外提供构造方法,需要传入抽象父类的成员变量对象 DrawAPI【接口】
2 重写父类的方法,通过传入的接口来调用。实现了桥接
DrawAPI【桥,载体】: 抽象接口
1 定义统一的抽象接口,供子类来实现
RedCircle、GreenCircle:具体的实现类
1 继承 DrawAPI ,可以作为参数传入的到 Circle对象中,在circle对象调用draw()方法时
实际上,走的是这两个实现类的具体方法
*/
public class BridgePatternDemo {
public static void main(String[] args) {
Shape redCircle = new Circle(100, 100, 10, new RedCircle());
Shape greenCircle = new Circle(100, 100, 10, new GreenCircle());
redCircle.draw();
greenCircle.draw();
}
}
思考:
通样可以新增Shape的继承类,构造是动态传入DrawAPI的实例化对象。 可以做到形状和颜色随意构造。DrawAPI就起到了桥接作用。做到了抽象和实现向分离