【问题标题】:A Bridge Pattern example桥接模式示例
【发布时间】:2010-12-20 19:38:57
【问题描述】:

我在wikipedia 的这个桥接模式示例上花了一些时间,但是,我仍然不明白这个桥接模式试图解释什么。

接口绘图API { 公共无效drawCircle(双x,双y,双半径); } /** "ConcreteImplementor" 1/2 */ 类 DrawingAPI1 实现 DrawingAPI { 公共无效drawCircle(双x,双y,双半径){ System.out.printf("API1.circle at %f:%f radius %f\n", x, y, radius); } } /** "ConcreteImplementor" 2/2 */ 类 DrawingAPI2 实现 DrawingAPI { 公共无效drawCircle(双x,双y,双半径){ System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius); } } /** “抽象” */ 界面形状{ 公共无效绘制(); // 低级 public void resizeByPercentage(double pct); // 高水平 } /** “精炼抽象” */ 类 CircleShape 实现形状 { 私人双 x,y,半径; 私有绘图API绘图API; public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) { 这个.x = x;这个.y = y; this.radius = 半径; this.drawingAPI = 绘图API; } // 低级,即特定于实现 公共无效绘制(){ 绘图API.drawCircle(x, y, 半径); } // 高级别的,即抽象特定的 公共无效resizeByPercentage(双百分比){ 半径 *= pct; } } /** “客户” */ 类主{ 公共静态无效主要(字符串[]参数){ 形状 [] 形状 = 新形状 [2]; 形状[0] = new CircleShape(1, 2, 3, new DrawingAPI1()); 形状[1] = new CircleShape(5, 7, 11, new DrawingAPI2()); 对于(形状形状:形状){ shape.resizeByPercentage(2.5); 形状.draw(); } } }

子类 CircleShape 构造函数接受 4 个参数,在它的 draw() 方法中,前 3 个参数被传递给第四个参数,它可以是来自 DrawingAPI 的任何子类。 那么这是否意味着使用桥接模式可以增加灵活性呢? 这个例子还能告诉我们更多信息吗?

谢谢!!!!

【问题讨论】:

标签: java design-patterns bridge


【解决方案1】:

一个更具体的例子说明为什么这会更清楚。假设 DrawingAPI1 封装了您的图形驱动程序,而 DrawingAPI2 为您的打印机驱动程序做同样的事情。然后 DrawingAPI 是您的图形系统的通用 API。它允许您在显示器上绘制一个 CircleShape 并使用相同的代码将其打印在一张纸上,您只需要传入不同的 DrawingAPI 实现即可。但是,如果您将 DrawingAPI 传递给 Shape.draw() 而不是将其传递给构造函数,它会更加灵活,因为您可以为监视器和打印机使用相同的对象图。

【讨论】:

  • 谢谢,我现在对模式有了更清晰的认识。在google了几个小时关于模式之后,我找到了一个很好的模式链接allappforum.com/java_design_patterns/creational_patterns.htm有一个关于桥模式的简单例子。有一个接口叫 Switch,两个子类叫 Bulb 和 Fan,每个子类都有自己的 Switch 实现。一个很好的简单例子。
【解决方案2】:

子类 CircleShape 构造函数接受 4 个参数,在它的 draw() 方法中,前 3 个参数被传递给第四个参数,它可以是来自 DrawingAPI 的任何子类。那么这是否意味着使用桥接模式可以增加灵活性呢?这个例子还能告诉我们更多信息吗?

这不仅仅是灵活性。 桥接模式将抽象与实现分离,两者可以不同

由于CircleShape 使用组合来包含DrawingAPI 而没有继承,您可以将DrawingAPI API 替换为DrawingAPI 的多个实现中的任何一个

ShapeCircleShape 可以独立更改,而不依赖于 DrawingAPI

您可以在下面的 SE 帖子中找到有关 Bridge 模式的更多详细信息,其中解释了不同的示例:

Does the Bridge Pattern decouples an abstraction from implementation?

【讨论】:

    猜你喜欢
    • 2013-01-06
    • 2013-05-31
    • 2017-07-14
    • 2019-03-03
    • 2011-01-16
    • 2019-08-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多