设计模式——桥接模式

一、什么是桥接模式?


《大话设计模式》中有一个场景:当我们要进行绘画时,有两种选择:蜡笔和水彩。蜡笔是将笔和颜料混合在一起成为了一个整体,那么如果我们需要大号、中号、小号各12种颜色的蜡笔,总共36支,这无疑是一笔很大的花费,那么如果使用水彩呢?水彩用的是毛笔,我们只需要大中小三支毛笔,以及12种需要的颜料就可以完成这项任务,这样总共只需要15种物品,大大减少了需要的物品数目。这就是典型的桥接模式的应用,桥接模式就是把事物和其具体的实现进行分离,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化。如上面的例子,关键在于两件事物是否能分离,蜡笔无法将笔和颜色分离,而毛笔是可以的,所以毛笔和颜料完成了解耦,两者可以独立地变化。


桥接模式降低了系统间的耦合度,并且大大减少了代码量。


JDBC的数据库驱动就是一个桥,JDBC进行连接数据库的时候,不管底层使用了怎么样的数据库,只要配合了相应的JDBC代码,就可以使用。


二、桥接模式框图



三、使用桥接模式完成上述的绘画过程


3.1 Color类,颜色,内部只有一个color的字符串成员

package designpatterns.bridge;

/**
 * Created by Olive on 2017/12/3.
 */
public class Color {
    public String color;
}

3.2 Brush类,毛笔的抽象类,内部持有了Color类的一个实例,有一个抽象的paint方法以及一个设置颜色的setColor方法

package designpatterns.bridge;


/**
 * Created by Olive on 2017/12/3.
 */
public abstract class Brush {

    Color c;

    public abstract void paint();

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

3.3 “三原色”类,继承至Color类,构造方法中指定了Color类的字符串成员color的具体属性

package designpatterns.bridge;

/**
 * Created by Olive on 2017/12/3.
 */
public class Red extends Color {

    public Red() {
        this.color = "red";
    }
}

public class Yellow extends Color{

    public Yellow() {
        this.color = "yellow";
    }
}

public class Blue extends Color{

    public Blue() {
        this.color = "blue";
    }
}

3.4 BigBrush类,大号毛笔

package designpatterns.bridge;

/**
 * Created by Olive on 2017/12/3.
 */
public class BigBrush extends Brush{

    public void paint() {
        System.out.println("Using big brush to paint " + c.color);
    }
}

3.5 SmallBrush类,小号毛笔

package designpatterns.bridge;

/**
 * Created by Olive on 2017/12/3.
 */
public class SmallBrush extends Brush{

    public void paint() {
        System.out.println("Using small brush to paint " + c.color);
    }
}

3.6 Painting类,用不同大小的毛笔以及不同的颜料进行绘画

package designpatterns.bridge;

/**
 * Created by Olive on 2017/12/3.
 */
public class Painting {

    public static void main(String[] args){

        Brush brush = new BigBrush();
        brush.setColor(new Red());
        brush.paint();
        brush.setColor(new Yellow());
        brush.paint();
        brush.setColor(new Blue());
        brush.paint();

        System.out.println();
        System.out.println("**********************************");
        System.out.println();

        brush = new SmallBrush();
        brush.setColor(new Red());
        brush.paint();
        brush.setColor(new Yellow());
        brush.paint();
        brush.setColor(new Blue());
        brush.paint();
    }
}

3.7 运行结果

Using big brush to paint red
Using big brush to paint yellow
Using big brush to paint blue

**********************************

Using small brush to paint red
Using small brush to paint yellow
Using small brush to paint blue

Process finished with exit code 0

四、一点小总结

  

桥接模式与适配器模式都是让两种事物一起工作,两者之间有时候容易弄混,那么具体怎么区分呢?还是那句话:设计的思想不同。适配器模式改变接口,使两个接口间进行兼容,比如说电源适配器让只能使用5V电源的手机可以使用220V进行充电。桥接模式是将抽象化与实现进行分离,可以让两者有各自的变化。反应到具体实现中,如果已经存在两个接口,想让两者兼容运行,那么可以使用适配器模式;但是如果现在还没有接口,只是想让两者分开实现,就可以使用桥接模式。适配器是在有两边的接口的前提下,才设计使用的;而桥接模式是先设计桥,再有桥两边的模块

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值