Github:BridgePattern
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
定义形状枚举类。此枚举类可以不用,仅仅是打印时区分
public enum ShapeEnums{CIRCLE, RECTANGLE;}
定义画图接口及实现类 ```java /**
- 定义画图接口 */ public interface DrawApi{ void draw(ShapeEnums shapeEnums, int x, int y, int raduis); }
/**
- 实现画图接口,画红色
*/
public class RedDraw implements DrawApi{
@Override
public void draw(ShapeEnums shapeEnums, int x, int y, int raduis) {
} }System.out.println(String.format("draw red %s. [x: %s, y: %s, raduis: %s]", shapeEnums, x, y, raduis));
/**
- 实现画图接口,画蓝色
*/
public class BlueDraw implements DrawApi{
@Override
public void draw(ShapeEnums shapeEnums, int x, int y, int raduis) {
} } ```System.out.println(String.format("draw blue %s. [x: %s, y: %s, raduis: %s]", shapeEnums, x, y, raduis));
定义形状抽象类及实现类 ```java /**
形状抽象类 */ public abstract class Shape{ protected DrawApi drawApi;
protected Shape(DrawApi drawApi) { this.drawApi = drawApi; }
/**
- 虽然这里也可以有具体实现,但为了解耦,各自形状有各自的draw逻辑。所以这里只定义 */ protected abstract void draw(); }
/**
实现形状抽象类,定义具体形状 */ public class Circle extends Shape{ int x, y, raduis; private ShapeEnums shapeEnums = ShapeEnums.CIRCLE;
public Circle(int x, int y, int raduis, DrawApi drawApi) {
super(drawApi);this.x = x;this.y = y;this.raduis = raduis;
}
@Override protected void draw() {
drawApi.draw(shapeEnums, x, y, raduis);
} }
/**
矩形 */ public class Rectangle extends Shape{ int x, y, raduis; private ShapeEnums shapeEnums = ShapeEnums.RECTANGLE;
public Rectangle(int x, int y, int raduis, DrawApi drawApi) {
super(drawApi);this.x = x;this.y = y;this.raduis = raduis;
}
/**
- 虽然这里也可以有具体实现,但为了解耦,各自形状有各自的draw逻辑。所以这里只定义 */ @Override protected void draw() { drawApi.draw(shapeEnums, x,y, raduis); } } ```
- 测试 ```java public static void main(String[] args) { BridgePattern pattern = new BridgePattern(); pattern.bridge(); }
private void bridge() { // 画蓝色圆形 Circle circle = new Circle(10, 20, 100, new BlueDraw()); circle.draw();
// 画红色圆形circle = new Circle(10, 20, 200, new RedDraw());circle.draw();// 画红色矩形Rectangle rectangle = new Rectangle(20,30,400, new RedDraw());rectangle.draw();
}
输出结果:```javadraw blue CIRCLE. [x: 10, y: 20, raduis: 100]draw red CIRCLE. [x: 10, y: 20, raduis: 200]draw red RECTANGLE. [x: 20, y: 30, raduis: 400]
