-
目的
-
Decorator 模式:用于动态地给对象添加新的功能,而不改变其结构。它通过将对象放入一个装饰器类中,在运行时为对象添加额外的行为。这种模式通常用于需要对类的功能进行组合或扩展的场景。
-
Bridge 模式:用于将抽象部分与其实现部分分离,以便它们可以独立地变化。桥接模式的主要目的是解耦抽象和实现,从而使得它们可以独立扩展和变化。
-
-
Decorator 模式:
- 需要在不改变原有对象的情况下,动态地为对象添加新功能。
- 希望通过组合不同的装饰器类来扩展对象的行为。
-
Bridge 模式:
- 抽象和实现部分需要独立变化,而不影响彼此。
- 系统中有多个抽象和实现的组合,桥接模式可以减少类的数量。
4. 例子对比
-
Decorator:例如,假设你有一个简单的咖啡类,你希望能够动态地为咖啡添加不同的配料(如牛奶、糖、香草等),你可以使用装饰器模式来实现这个需求。
-
Bridge:在桥接模式的例子中,假设你有不同的图形类(如圆形、方形),并且你希望这些图形可以有不同的颜色实现(如红色、蓝色)。使用桥接模式可以将图形的形状和颜色实现解耦,以便你可以独立扩展形状和颜色的组合。
假设我们在开发一个绘图应用程序,需要绘制不同形状的对象,并且这些形状可以用不同的颜色进行渲染。我们可以使用桥接模式将形状和颜色分离,使得它们可以独立变化。
1. 创建颜色接口和具体实现
java// 颜色接口 public interface Color { void applyColor(); } // 具体颜色实现 public class RedColor implements Color { @Override public void applyColor() { System.out.println("Applying red color"); } } public class GreenColor implements Color { @Override public void applyColor() { System.out.println("Applying green color"); } }
2. 创建形状抽象类
java// 形状抽象类,使用组合的方式包含颜色 public abstract class Shape { protected Color color; public Shape(Color color) { this.color = color; } public abstract void draw(); }
3. 创建具体的形状实现
javapublic class Circle extends Shape { public Circle(Color color) { super(color); } @Override public void draw() { System.out.print("Drawing Circle in "); color.applyColor(); } } public class Square extends Shape { public Square(Color color) { super(color); } @Override public void draw() { System.out.print("Drawing Square in "); color.applyColor(); } }
4. 使用桥接模式
javapublic class BridgePatternDemo { public static void main(String[] args) { Shape redCircle = new Circle(new RedColor()); Shape greenSquare = new Square(new GreenColor()); redCircle.draw(); // Drawing Circle in Applying red color greenSquare.draw(); // Drawing Square in Applying green color } }
输出结果
scssDrawing Circle in Applying red color Drawing Square in Applying green color
总结
在这个示例中,我们使用了桥接模式将形状(Shape
)与颜色(Color
)的实现分离开来。通过这种方式,可以自由组合不同的形状和颜色,而无需创建大量的子类来支持每种可能的组合。这样,形状和颜色可以独立扩展,增加新的形状或颜色时只需创建新的具体类,而不需要更改现有代码,体现了开闭原则。