设计模式——桥接模式

来源:互联网 发布:江苏运时数据待遇如何 编辑:程序博客网 时间:2024/05/16 13:49

一、什么是桥接模式?


《大话设计模式》中有一个场景:当我们要进行绘画时,有两种选择:蜡笔和水彩。蜡笔是将笔和颜料混合在一起成为了一个整体,那么如果我们需要大号、中号、小号各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 redUsing big brush to paint yellowUsing big brush to paint blue**********************************Using small brush to paint redUsing small brush to paint yellowUsing small brush to paint blueProcess finished with exit code 0

四、一点小总结

  

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

原创粉丝点击