Bridge Pattern(桥接模式)
一、Bridge Pattern简介
1.1 定义
将抽象与其实现解耦,使它们都可以独立地变化。
这里实现指的是抽象类及其派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类)。
1.2 Bridge Pattern通用结构
二、Bridge Pattern关键特征
名称 | 说明 |
---|---|
意图 | 将一组实现与另一组使用它们的对象分离 |
问题 | 一个抽象类的的派生类必须使用多个实现,但是不能出现类数量爆炸性增长 |
解决方案 | 为所有实现定义一个接口,供抽象类的所有派生类使用 |
参与者与协作者 | Abstraction为要实现的对象定义接口, Implementor为具体实现定义接口。 Abstraction的派生类使用Implement的派生类,却无需知道自己具体要使用哪一个ConcreteImplementor |
效果 | 实现与使用实现的对象解耦,提供了可扩展性,客户对象无需操心实现问题 |
实现 | 将实现封装在一个抽象类中,在要实现的抽象的基类中包含一个实现的句柄。 |
三、代码
3.1 UML图
3.2 Client
package com.qwm.bridge;
import java.util.ArrayList;
import java.util.List;
/**
* @author: qiwenming(杞文明)
* @date: 16/8/2 上午10:47
* @className: Client
* @description: 客户端调用
*/
public class Client {
public static void main(String[] args){
List<Shape> shapes = getShape();
for (Shape shape: shapes) {
shape.draw();
}
}
//这个方法是用来创建我们需要的图像的
private static List<Shape> getShape(){
List<Shape> shapes = new ArrayList<>();
Drawing drawing1 = new V1Drawing();
Drawing drawing2 = new V2Drawing();
Shape shape1 = new Rectangle(drawing1,1,1,20,20);
Shape shape2 = new Rectangle(drawing1,4,5,8,40);
Shape shape3 = new Rectangle(drawing1,5,6,80,90);
Shape shape4 = new Rectangle(drawing1,1,5,20,30);
Shape shape5 = new Rectangle(drawing2,1,1,20,20);
Shape shape6 = new Rectangle(drawing2,4,5,8,40);
Shape shape7 = new Rectangle(drawing2,5,6,80,90);
Shape shape8 = new Rectangle(drawing2,1,5,20,30);
Shape shape9 = new Circle(drawing1,5,5,5);
Shape shape10 = new Circle(drawing1,8,5,4);
Shape shape11 = new Circle(drawing1,90,30,6);
Shape shape12 = new Circle(drawing1,80,7,7);
Shape shape13 = new Circle(drawing2,5,5,5);
Shape shape14 = new Circle(drawing2,8,5,4);
Shape shape15 = new Circle(drawing2,90,30,6);
Shape shape16 = new Circle(drawing2,80,7,7);
shapes.add(shape1);
shapes.add(shape2);
shapes.add(shape3);
shapes.add(shape4);
shapes.add(shape5);
shapes.add(shape6);
shapes.add(shape7);
shapes.add(shape8);
shapes.add(shape9);
shapes.add(shape10);
shapes.add(shape11);
shapes.add(shape12);
shapes.add(shape13);
shapes.add(shape14);
shapes.add(shape15);
shapes.add(shape16);
return shapes;
}
}
3.3 Shape以及实现
package com.qwm.bridge;
/**
* @author: qiwenming(杞文明)
* @date: 16/8/1 下午6:56
* @className: ShapeAbstract
* @description: Shape抽象
*/
abstract class Shape{
public abstract void draw();
protected void drawLine(int x1,int y1,int x2,int y2){
myDrawing.drawLine(x1,y1,x2,y2);
}
protected void drawCirCle(int x,int y,int r){
myDrawing.drawCircle(x,y,r);
}
protected Drawing myDrawing;
public Shape(Drawing drawing){
this.myDrawing = drawing;
}
}
class Rectangle extends Shape{
private int _x1,_x2,_y1,_y2;
public Rectangle(Drawing drawing, int _x1, int _x2, int _y1, int _y2) {
super(drawing);
this._x1 = _x1;
this._x2 = _x2;
this._y1 = _y1;
this._y2 = _y2;
}
@Override
public void draw() {
System.out.println("------开始矩形--------");
drawLine(_x1,_y1,_x2,_y1);
drawLine(_x2,_y1,_x2,_y2);
drawLine(_x2,_y2,_x1,_y2);
drawLine(_x1,_y2,_x1,_y1);
System.out.println("------结束矩形--------");
}
}
class Circle extends Shape{
private int _x,_y,_r;
public Circle(Drawing drawing, int _x, int _y, int _r) {
super(drawing);
this._r = _r;
this._x = _x;
this._y = _y;
}
@Override
public void draw() {
System.out.println("------开始圆--------");
drawCirCle(_x,_y,_r);
System.out.println("------开始圆--------");
}
}
3.4 Drawing及其实现
package com.qwm.bridge;
/**
* @author: qiwenming(杞文明)
* @date: 16/8/2 上午10:04
* @className: Drawing
* @description: 画图相关的
*/
public interface Drawing {
void drawLine(int x1,int y1,int x2,int y2);
void drawCircle(int x,int y,int r);
}
class V1Drawing implements Drawing{
@Override
public void drawLine(int x1, int y1, int x2, int y2) {
DP1.draw_a_line(x1,x2,y1,y2);
}
@Override
public void drawCircle(int x, int y, int r) {
DP1.draw_a_circle(x,y,r);
}
}
class V2Drawing implements Drawing{
@Override
public void drawLine(int x1, int y1, int x2, int y2) {
DP2.drawline(x1,y1,x2,y2);
}
@Override
public void drawCircle(int x, int y, int r) {
DP2.drawcircle(x,y,r);
}
}
3.5 DP
package com.qwm.bridge;
/**
* @author: qiwenming(杞文明)
* @date: 16/8/1 下午6:59
* @className: DP
* @description: 画图程序
*/
class DP1{
public static void draw_a_line(int x1,int x2,int y1,int y2){
String str = "x1,x2=:" +x1+ "," +x2 +"----------> y1,y2=:" +y1+ "," +y2 ;
System.out.println("DP1 draw_a_line:"+str);
}
public static void draw_a_circle(int x,int y,int r){
String str = "x:" + x + " y:" + y +" r:"+r;
System.out.println("DP1 draw_a_circle: "+str);
}
}
class DP2{
public static void drawline(int x1,int y1,int x2,int y2){
String str = "(" +x1+ "," +y1 +")----------> (" +y1+ "," +y2+")" ;
System.out.println("DP2 drawline:"+str);
}
public static void drawcircle(int x,int y,int r){
String str = "x:" + x + " y:" + y +" r:"+r;
System.out.println("DP2 drawcircle: "+str);
}
}
3.6 结果
------开始矩形--------
DP1 draw_a_line:x1,x2=:1,1----------> y1,y2=:20,20
DP1 draw_a_line:x1,x2=:1,1----------> y1,y2=:20,20
DP1 draw_a_line:x1,x2=:1,1----------> y1,y2=:20,20
DP1 draw_a_line:x1,x2=:1,1----------> y1,y2=:20,20
------结束矩形--------
------开始矩形--------
DP1 draw_a_line:x1,x2=:4,5----------> y1,y2=:8,8
DP1 draw_a_line:x1,x2=:5,5----------> y1,y2=:8,40
DP1 draw_a_line:x1,x2=:5,4----------> y1,y2=:40,40
DP1 draw_a_line:x1,x2=:4,4----------> y1,y2=:40,8
------结束矩形--------
------开始矩形--------
DP1 draw_a_line:x1,x2=:5,6----------> y1,y2=:80,80
DP1 draw_a_line:x1,x2=:6,6----------> y1,y2=:80,90
DP1 draw_a_line:x1,x2=:6,5----------> y1,y2=:90,90
DP1 draw_a_line:x1,x2=:5,5----------> y1,y2=:90,80
------结束矩形--------
------开始矩形--------
DP1 draw_a_line:x1,x2=:1,5----------> y1,y2=:20,20
DP1 draw_a_line:x1,x2=:5,5----------> y1,y2=:20,30
DP1 draw_a_line:x1,x2=:5,1----------> y1,y2=:30,30
DP1 draw_a_line:x1,x2=:1,1----------> y1,y2=:30,20
------结束矩形--------
------开始矩形--------
DP2 drawline:(1,20)----------> (20,20)
DP2 drawline:(1,20)----------> (20,20)
DP2 drawline:(1,20)----------> (20,20)
DP2 drawline:(1,20)----------> (20,20)
------结束矩形--------
------开始矩形--------
DP2 drawline:(4,8)----------> (8,8)
DP2 drawline:(5,8)----------> (8,40)
DP2 drawline:(5,40)----------> (40,40)
DP2 drawline:(4,40)----------> (40,8)
------结束矩形--------
------开始矩形--------
DP2 drawline:(5,80)----------> (80,80)
DP2 drawline:(6,80)----------> (80,90)
DP2 drawline:(6,90)----------> (90,90)
DP2 drawline:(5,90)----------> (90,80)
------结束矩形--------
------开始矩形--------
DP2 drawline:(1,20)----------> (20,20)
DP2 drawline:(5,20)----------> (20,30)
DP2 drawline:(5,30)----------> (30,30)
DP2 drawline:(1,30)----------> (30,20)
------结束矩形--------
------开始圆--------
DP1 draw_a_circle: x:5 y:5 r:5
------开始圆--------
------开始圆--------
DP1 draw_a_circle: x:8 y:5 r:4
------开始圆--------
------开始圆--------
DP1 draw_a_circle: x:90 y:30 r:6
------开始圆--------
------开始圆--------
DP1 draw_a_circle: x:80 y:7 r:7
------开始圆--------
------开始圆--------
DP2 drawcircle: x:5 y:5 r:5
------开始圆--------
------开始圆--------
DP2 drawcircle: x:8 y:5 r:4
------开始圆--------
------开始圆--------
DP2 drawcircle: x:90 y:30 r:6
------开始圆--------
------开始圆--------
DP2 drawcircle: x:80 y:7 r:7
------开始圆--------