设计模式-桥接模式

一、定义

 将抽象和实现解耦,使得两者可以独立地变化。

桥接模式的四个角色:

Abstraction抽象化角色:定义角色行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。

Implementor实现化角色:接口或抽象类,定义角色必须的行为或属性。

RefinedAbstraction修正抽象化角色:扩充抽象化角色。

ConcreateImplementor具体实现化角色:实现化角色的实现类。

二、类型

 结构型

三、适用场景

  • 不适合使用继承的场景:继承产生类爆炸。
  • 接口或抽象类不稳定的场景:明知接口或抽象类不稳定还使用继承或实现的方式完成业务需求。
  • 重用性要求较高的场景:设计的粒度越细,则被重用的可能性越大,采用继承则受到父类的限制,不可能出现太细的粒度。

四、优点

  • 抽象和实现分离:实现可以不受抽象约束,不用再绑定在一个固定的抽象层次上。
  • 优秀的扩充能力:对外暴露接口,实现对应的接口即可完成功能的添加。
  • 实现细节对客户透明:客户不用关心实现细节,它已经由抽象层通过聚合关系完成了封装。

五、缺点

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。 
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

六、类图

 

七、代码实现

Abstraction抽象化角色:

package com.wms.structural.bridge;

import java.sql.Connection;

public abstract class ConvertDataToFile {
    private DBConnection connection;

    public ConvertDataToFile(DBConnection connection) {
        this.connection = connection;
    }

    public Connection getConnection() {
        return this.connection.getConnection();
    }

    public abstract void convertToFile();
}

 Implementor实现化角色:

package com.wms.structural.bridge;

import java.sql.Connection;

public interface DBConnection {
    Connection getConnection();
}

 RefinedAbstraction修正抽象化角色:

1)

package com.wms.structural.bridge;

public class ConvertDataToTxtFile extends ConvertDataToFile {
    public ConvertDataToTxtFile(DBConnection connection) {
        super(connection);
    }

    public void convertToFile() {
        this.getConnection();
        System.out.println("转换为txt文件");
    }
}

 2)

package com.wms.structural.bridge;

public class ConvertToPdfFile extends ConvertDataToFile {
    public ConvertToPdfFile(DBConnection connection) {
        super(connection);
    }

    @Override
    public void convertToFile() {
        this.getConnection();
        System.out.println("转换为pdf文件");
    }
}

 ConcreateImplementor具体实现化角色:

1)

package com.wms.structural.bridge;

import java.sql.Connection;

public class MysqlDBConnection implements DBConnection {
    public Connection getConnection() {
        System.out.println("获取mysql数据连接");
        return null;
    }
}

2)

package com.wms.structural.bridge;

import java.sql.Connection;

public class OracleDBConnection implements DBConnection {
    public Connection getConnection() {
        System.out.println("获取oracle数据连接");
        return null;
    }

}

测试类:

package com.wms.structural.bridge;

public class Test {
    public static void main(String[] args) {
        // new操作在框架中可以使用依赖注入
        DBConnection mysqlConnection = new MysqlDBConnection();
        DBConnection oracleConnection = new OracleDBConnection();

        ConvertDataToFile convertDataToTxtFile = new ConvertDataToTxtFile(mysqlConnection);
        convertDataToTxtFile.convertToFile();
        convertDataToTxtFile = new ConvertDataToTxtFile(oracleConnection);
        convertDataToTxtFile.convertToFile();

        ConvertDataToFile convertDataToPdfFile = new ConvertToPdfFile(oracleConnection);
        convertDataToPdfFile.convertToFile();
    }
}

 

posted @ 2019-01-20 18:03  请叫我大表哥  阅读(211)  评论(0编辑  收藏  举报