前言:

写了N多年代码,知道设计模式已经有8,9年了,用过设计模式,有一些又很好的用处。但是也有一些是不应该存在的设计模式。

从这里开始: 

桥接模式

1.作用:

将一个抽象与实现解耦,以便两者可以独立的变化。(摘自wiki

2.UML

3.代码:

/** "Implementor" */
interface DrawingAPI
{
    public void drawCircle(double x, double y, double radius);
}
 
/** "ConcreteImplementor" 1/2 */
class DrawingAPI1 implements DrawingAPI
{
   public void drawCircle(double x, double y, double radius) 
   {
        System.out.printf("API1.circle at %f:%f radius %f\n", x, y, radius);
   }
}
 
/** "ConcreteImplementor" 2/2 */
class DrawingAPI2 implements DrawingAPI
{
   public void drawCircle(double x, double y, double radius) 
   { 
        System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius);
   }
}
 
/** "Abstraction" */
interface Shape
{
   public void draw();                                            // low-level
   public void resizeByPercentage(double pct);     // high-level
}
 
/** "Refined Abstraction" */
class CircleShape implements Shape
{
   private double x, y, radius;
   private DrawingAPI drawingAPI;
   public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI)
   {
       this.x = x;  this.y = y;  this.radius = radius; 
       this.drawingAPI = drawingAPI;
   }
 
   // low-level i.e. Implementation specific
   public void draw()
   {
        drawingAPI.drawCircle(x, y, radius);
   }   
   // high-level i.e. Abstraction specific
   public void resizeByPercentage(double pct)
   {
        radius *= pct;
   }
}
 
/** "Client" */
class BridgePattern {
   public static void main(String[] args)
   {
       Shape[] shapes = new Shape[2];
       shapes[0] = new CircleShape(1, 2, 3, new DrawingAPI1());
       shapes[1] = new CircleShape(5, 7, 11, new DrawingAPI2());
 
       for (Shape shape : shapes)
       {
           shape.resizeByPercentage(2.5);
           shape.draw();
       }
   }
}

4.评论:

这个模式是为了模式而模式,有一个问题:

如果代码写成这个样子,会有一门课叫做《重构》等待着你,这就是挣钱的原因。都让计算机专家赚走了。

Shape已经有了完全的抽象,DrawAPI有存在的必要马?No。看不到任何的用处?写在了Draw方法中和写在DrawAPI中没有任何区别。

实际上类似而真正有用的例子是输出到外设上:比如绘制到屏幕、压感笔上。但是这里的基本原理是:屏幕和压感笔实现了一套相同的绘画API。

Shape的Draw使用了绘制API,输出到真正的设备上。

这才是真正有意义的地方。wait?我为什么觉得我们在这里:偏题了。只有对抽象的扩充,已形成新的实现。没有出现和作用所言的,二者独立变化!!!

将一个抽象与实现解耦,以便两者可以独立的变化??抽象没有一丝一毫的变化,只有现实在变化。抽象没有丝毫的变化。一旦出现这种情况。抽象进行了变化,以为着什么。抽象进行了扩充,增强了功能。但是实现依然是抽象的实现。

(这不是外观模式吗?那么桥接模式在那里?)

一旦抽象和实现解耦,意味这他们拥有着不同的含义。这个时候,进行重构吧。

posted on 2015-04-11 19:19  tom_zhao_vip  阅读(605)  评论(0编辑  收藏  举报