【桥接设计模式详解】Java/JS/Go/Python/TS不同语言实现
简介
如果你希望在几个独立维度上扩展一个类,或者你想要拆分、重组一个具有多重功能的复杂类(例如能与多个数据库服务器进行交互的类),或者你想在运行时切换不同的实现方法,可以使用桥接模式。
作用
- 在有多种可能会变化的情况下,用继承扩展起来不灵活,桥接可以解决类似问题。
- 桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
实现步骤
- 定义一个工具接口,供不同工具类来实现。
- 建立多个具体工具类实现基础工具接口,这些工具是负责具体能力实现。
- 定义一个基础抽象类,里面聚合了工具接口,相当于桥接器。
- 建立具体对象类,继承自基础抽象类,调用工具类里的方法来实现具体功能。
UML
代码
基础抽象类
// AbstractShape.java 定义抽象桥接器,关联图形操作接口 public abstract class AbstractShape {s protected DrawTool drawTool; protected AbstractShape(DrawTool drawTool { this.drawTool = drawTool; } public abstract void draw(int x, int y, int radius; }
具体桥接器实现类
// RefinedShape.java 具体桥接类,继承抽象桥接类,扩充了自己的方法 public class RefinedShape extends AbstractShape { public RefinedShape(DrawTool drawTool { super(drawTool; } @Override public void draw(int x, int y, int radius { System.out.println(String.format("RefinedShape::draw( [x=%s y=%s radius=%s]", x, y, radius; // 通过工具类实际绘制 drawTool.drawStyle(; } // 新增的方法,可作为工具类的补充 public void drawDone( { System.out.println("RefinedShape::drawDone(, 执行的drawTool是: " + drawTool.getClass(.getSimpleName(; } }
定义工具接口类
// DrawTool.java 图形操作基础接口 public interface DrawTool { public void drawStyle(; }
定义工具实现类,可以多个
```java // DrawStyleA.java 画圆A,实现了图画基础API public class DrawStyeA implements DrawTool { @Override public void drawStyle( { System.out.println("DrawStyleA:drawStyle("; } } ``` ```java // 画圆B,实现了图画基础API public class DrawStyleB implements DrawTool { @Override public void drawStyle( { System.out.println("DrawStyleB:drawStyle("; } }
测试调用
/** * 桥接模式是将基础抽象类作为桥接器,用来连接业务对象和具体动作,将两者充分解耦。 * 具体对象以抽象对象为父类,实现父类方法。 * 具体工具类实现统一的工具接口,为抽象桥接对象服务 * 使用时,声明具体对象同时传入具体工具,使得具体对象可以使用具体工具的动作。 */ // 用抽象类来声明具体对象,并指定具体工具 AbstractShape shape = new RefinedShape(new DrawStyeA(; // 调用对象的方法,里面执行了工具类的方法 shape.draw(10, 20, 50; RefinedShape shape1 = (RefinedShape shape; // 类型强转为具体业务类,调用具体类的方法 shape1.drawDone(; // /*********************** 分割线 ******************************************/ // 直接用具体类来声明对象,并指定另外的工具 RefinedShape shape2 = new RefinedShape(new DrawStyleB(; // 调用对象的方法,里面执行了工具类的方法 shape2.draw(11, 22, 33; shape2.drawDone(;
更多语言版本
https://github.com/microwind/design-pattern