1. 设计模式-桥接模式
桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与它的实现部分分离,使它们可以独立变化。这种模式通过创建一个抽象类和一个实现类的层次结构,将类的抽象部分和它的实现部分分离开来,从而可以更加灵活地组合对象。
桥接模式的关键在于将抽象(Abstraction)与实现(Implementation)分离开来,并通过一个“桥”(Bridge)来连接它们。抽象部分定义了操作的接口,但不包含任何具体实现;实现部分则提供了抽象部分的具体实现。两者通过聚合关系(而不是继承关系)耦合在一起,使得抽象和实现可以独立变化。
假设我们要设计一个图形界面库,它支持不同的图形(圆形、矩形)和不同的绘制平台(Windows、Linux)。
2. 抽象化(Abstraction)
public abstract class Shape {
protected DrawingAPI api;
protected Shape(DrawingAPI drawingAPI) {
this.api = drawingAPI;
}
public abstract void draw();
public abstract void resizeByPercentage(double pct);
}
3. 实现化接口(Implementor)
public interface DrawingAPI {
void drawCircle(int x, int y, int radius);
void drawRectangle(int x, int y, int width, int height);
}
4. 具体实现化类(Concrete Implementor)
public class DrawingAPI1 implements DrawingAPI {
@Override
public void drawCircle(int x, int y, int radius) {
System.out.println("API1.circle at " + x + "," + y + " radius " + radius);
}
@Override
public void drawRectangle(int x, int y, int width, int height) {
System.out.println("API1.rectangle at " + x + "," + y + " width " + width + " height " + height);
}
}
public class DrawingAPI2 implements DrawingAPI {
@Override
public void drawCircle(int x, int y, int radius) {
System.out.println("API2.circle at " + x + "," + y + " radius " + radius);
}
@Override
public void drawRectangle(int x, int y, int width, int height) {
System.out.println("API2.rectangle at " + x + "," + y + " width " + width + " height " + height);
}
}
5. 具体抽象化类(Refined Abstraction)
public class Circle extends Shape {
private int x, y, radius;
public Circle(DrawingAPI api, int x, int y, int radius) {
super(api);
this.x = x;
this.y = y;
this.radius = radius;
}
@Override
public void draw() {
api.drawCircle(x, y, radius);
}
@Override
public void resizeByPercentage(double pct) {
radius *= pct;
}
}
public class Rectangle extends Shape {
private int x, y, width, height;
public Rectangle(DrawingAPI api, int x, int y, int width, int height) {
super(api);
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
@Override
public void draw() {
api.drawRectangle(x, y, width, height);
}
@Override
public void resizeByPercentage(double pct) {
width *= pct;
height *= pct;
}
}
6. 使用示例
public class BridgePatternDemo {
public static void main(String[] args) {
Shape circle = new Circle(new DrawingAPI1(), 100, 200, 30);
Shape rectangle = new Rectangle(new DrawingAPI2(), 150, 250, 50, 40);
circle.draw();
rectangle.draw();
}
}
桥接模式通过分离抽象和实现,为系统提供了更高的灵活性和扩展性,尤其适合于那些需要支持多种实现方式的场景。它强调了“抽象和实现分离”的原则,有助于减少代码间的耦合,提高软件的可维护性和可扩展性。然而,是否采用桥接模式还需根据实际项目需求和复杂度来决定,避免不必要的设计复杂化。
7. 优点
- 分离抽象与实现:使得两者可以独立变化,有助于提高系统的可扩展性和可维护性。
- 更好的扩展性:可以轻松添加新的抽象类和实现类,而不会影响现有类。
- 优化设计:通过减少类的个数,降低系统的复杂度。
8. 缺点
- 增加系统的理解与设计难度:由于引入了更多的抽象和接口,初学者可能觉得设计变得更复杂。
- 过度设计风险:对于简单的需求,使用桥接模式可能会显得过度设计。