什么是桥接模式

维基百科上面的解释是:

把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。事物对象仅是一个抽象的概念。

简单来说,可以用下图来说明。

When:

        A
     /     \
    Aa      Ab
   / \     /  \
 Aa1 Aa2  Ab1 Ab2

Refactor to:

     A         N
  /     \     / \
Aa(N) Ab(N)  1   2

桥接模式 VS 工厂模式

桥接模式是结构型模式,工厂模式是创建型模式。

一个桥接模式实例

要向用户展示各种不同颜色(color)的图形(shape)。目前只有两种颜色,红色(red)和蓝色(blue)。图形也只有两种,圆形(circle)和方形(rectangle)。在这个例子中把颜色看成一个标准接口,接口只有一个方法(draw)。而具体的实现(到底是什么颜色)则由第三方去实现。抽象类(shape)中持有(color)引用。

在本例中,桥接模式的4要素分别是:

  • Abstraction 定义抽象的接口 –> shape
abstract class Shape{
    protected Color color;

    public void setColor(Color color){
        this.color = color;
    }

    public abstract void show();
}
  • Refined Abstraction 抽象接口Abstraction的子类 –> circle和rectangle
public class Circle extends Shape{
    public void show(){
        color.draw();
        System.out.println("圆形");
    }
}
public class Rectangle extends Shape{
    public void show(){
        color.draw();
        System.out.println("方形");
    }
}
  • Implementor 定义具体行为、具体特征的应用接口 –> color
interface color{
    void draw();
}
  • ConcreteImplementor 实现Implementor接口 –> red和blue
public class Red implements Color{
    public void draw(){
        System.out.println("红色");
    }
}
public class Blue implements Color{
    public void draw(){
        System.out.println("蓝色"):
    }
}

实例代码展示

Color.java

interface Color{
    void draw();
}

Red.java

public class Red implements Color{
    public void draw(){
        System.out.println("Red");
    }
}

Blue.java

public class Blue implements Color{
    public void draw(){
        System.out.println("Blue");
    }
}

Shape.java

abstract class Shape{
    protected Color color;

    public void setColor(Color color){
        this.color = color;
    }

    abstract void show();
}

Circle.java

public class Circle extends Shape{

    public void show(){
        color.draw();
        System.out.println("Circle");
    }
}

Rectangle.java

public class Rectangle extends Shape{
    public void show(){
        color.draw();
        System.out.println("Rectangle");
    }
}

pro.properties

shape=Circle
color=Red

PropertyUtil.java

import java.io.*;
import java.util.*;
public class PropertyUtil{
    public static Object getBean(String proField){
        Object obj = null;
        try{
            Properties prop = new Properties();
            InputStream in = new BufferedInputStream(new FileInputStream("pro.properties"));
            prop.load(in);
            String className = prop.getProperty(proField);
            Class c = Class.forName(className);
            obj = c.newInstance();
        }catch(Exception e){
            //Exception
            e.printStackTrace();
        }
        return obj;
    }
}

Client.java

public class Client{
    public static void main(String args[]){
        Color color = (Color)PropertyUtil.getBean("color");
        Shape shape = (Shape)PropertyUtil.getBean("shape");
        shape.setColor(color);

        shape.show();
    }
}

(完)