《设计模式解析》读书笔记之Bridge Pattern(桥接模式)


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
------开始圆--------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值