热门搜索 :
考研考公
您的当前位置:首页正文

设计模式小结-桥接模式

来源:东饰资讯网

桥接模式概述

在画图工具中,有各种不同类型的画笔,也有不同类型的颜色,可以用铅笔画黑色或红色,也可以用钢笔画黑色或红色,其实这个操作背后的设计模式就是桥接模式。如果不适用桥接模式,画4种不同颜色和类型的线,就需要4种比,如果颜色和画笔的种类更多,需要的画笔会指数级增长,这个时候,就需要有桥接模式了。

示例:

有一个数据转换工具,可以将数据库中的数据转换成多种文件格式,例如txt、xml、pdf等格式,同时该工具需要支持多种不同的数据库。试使用桥接模式对其进行设计。

UML图

示例解析

在该示例中,有两个独立变化的维度,分别是数据库类型和待转换的文件类型。ExactData是数据库读取数据后解析之后的数据,不同的数据库通过实现ExactDataImpl接口解析具体数据,抽象类AbstractFile持有ExactDataImpl对象,获取解析的数据,提供一个抽象的convetTo方法由子类实现。具体的文件类继承AbstractFile在convertTo进行数据的转换处理。

示例代码

数据库读取数据维度

public  class ExactData {
    //忽略内容
}
//数据解析接口
public interface ExactDataImpl {
    ExactData readFromDB( );
}

//具体数据库读取接口
public class MySQLImpl implements ExactDataImpl {
    @Override
    public ExactData readFromDB() {
        System.out.println("MySQL数据读取");
        return new ExactData();
    }
}
//具体数据库读取并解析数据
public class OracleImpl implements ExactDataImpl {

    @Override
    public ExactData readFromDB() {
        System.out.println("Oracle数据读取");
        return new ExactData();
    }
}
//具体数据库读取并解析数据
public class DB2Impl implements ExactDataImpl {

    @Override
    public ExactData readFromDB() {
        System.out.println("DB2数据读取");
        return new ExactData();
    }
}

文件生成维度

//文件生成抽象类
public abstract class AbstractFile {
    protected ExactDataImpl exactDataImpl;
    public void setExactDataImpl(ExactDataImpl exactDataImpl){
        this.exactDataImpl = exactDataImpl;
    }
    public abstract void convertTo(  );
}
//具体文件生成类
public class PDFFile extends AbstractFile {
    @Override
    public void convertTo() {
        ExactData exactData =  exactDataImpl.readFromDB();

        System.out.println("转换为PDF文件");
    }
}
//具体文件生成类
public class TXTFile extends AbstractFile {
    @Override
    public void convertTo() {
        ExactData exactData =   exactDataImpl.readFromDB();

        System.out.println("转为TXT文件");
    }
}
//具体文件生成类
public class XMLFile extends AbstractFile {
    @Override
    public void convertTo() {
        ExactData exactData = exactDataImpl.readFromDB();

        System.out.println("转换为XML文件");
    }
}

调用


AbstractFile abstractFile = new TXTFile();
            ExactDataImpl exactDataImpl = new MySQLImpl();
            abstractFile.setExactDataImpl(exactDataImpl);
            abstractFile.convertTo();

输出内容


MySQL数据读取
转为TXT文件

桥接模式优缺点

优点

    1. 桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合开闭原则
    1. 抽象对象间的关联关系,使得不同的维度可以更加容易组合在一起
    1. 桥接模式可以取代多层继承方案,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,桥接模式是比多层继承方案更好的解决方法

缺点

    1. 桥接模式的使用会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程。
    1. )桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也需要一定的经验积累。

桥接模式的适用场景

    1. 有两个或多个不同维度,切不同的维度都需要扩展
    1. 不希望使用继承或因为多层继承导致类的个数急剧增加,桥接模式非常适用
Top