设计模式:桥接模式
什么是桥接模式
按维基百科上面的解释是:
把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。事物对象仅是一个抽象的概念。
简单来说,可以用下图来说明。
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();
}
}
(完)