桥接模式可以将抽象和实现分离开来,两者可以单独变化互不干扰。
两者之间通过一个桥梁连接,所以称为桥接模式。
下面举一个具体的例子,假设这里有一个抽象类Shape,还有一些实现类RedCircle,GreenCircle.
它们之间通过桥梁DrawAPI接口连接起来。
桥梁接口(桥接模式中的桥梁)
public interface DrawAPI { public void drawCircle(float r,float x, float y); }
具体的实现类要实现桥梁接口(桥接模式中的实现部分)
GreenCircle
public class GreenCircle implements DrawAPI{ @Override public void drawCircle(float r, float x, float y) { System.out.println("draw greenCircle" + "r:" + r +" x:" + x + " y:" + y); } }
RedCircle
public class RedCircle implements DrawAPI{ @Override public void drawCircle(float r, float x, float y) { System.out.println("draw redCircle" + "r:" + r +" x:" + x + " y:" + y); } }
Shape(桥接模式中的抽象部分) Shape使用了DrawAPI(桥梁)
public abstract class Shape { protected DrawAPI drawAPI; public Shape(DrawAPI drawAPI) { // 抽象类也是类,只是不能由自身实例化, this.drawAPI = drawAPI; //一般通过子类实例化(默认调用无参构造方法),如果添加了构造方法,需要在子类中引用。 } public abstract void draw(); }
Circle :Shape的具体类
public class Circle extends Shape{ private float r; private float x; private float y; public Circle(float r, float x, float y,DrawAPI drawAPI) { super(drawAPI); // TODO Auto-generated constructor stub this.r = r; this.x = x; this.y = y; } @Override public void draw() { // TODO Auto-generated method stub drawAPI.drawCircle(r, x, y); } }
测试:
public class Main { public static void main(String[] args) { Shape greenCircle = new Circle(2, 0, 0, new GreenCircle()); greenCircle.draw(); Shape redCircle = new Circle(2, 0, 0, new RedCircle()); redCircle.draw(); } }
draw greenCircler:2.0 x:0.0 y:0.0
draw redCircler:2.0 x:0.0 y:0.0
上述抽象和实现之间通过桥梁连接,抽象和实现之间可以独立的变换,改变具体的实现类不会对抽象类造成影响。
改变抽象类也不会对实现类造成影响,只要两者连接的桥梁没有发生改变,两者都可以独立的变换而且易于扩展。