【设计模式】结构型模式2——桥接模式

桥接模式类图
将抽象与实现解耦,使两者各自独立变化,满足一个产品多维度变化的需求,个人理解相当于排列组合,将继承中的非同步变化的部分剥离成接口,解决类爆炸问题

实现部分
/**
 * 角色(Implementor,由ConcreteImplementor实现)
 */
public interface Phone {

    void call();

    void connectInternet();
}

public class Phone2G implements Phone{
    @Override
    public void call() {
        System.out.println("2G手机打电话......");
    }

    @Override
    public void connectInternet() {
        System.out.println("2G手机上网......");
    }
}
public class Phone5G implements Phone{

    @Override
    public void call() {
        System.out.println("5G手机打电话......");
    }

    @Override
    public void connectInternet() {
        System.out.println("5G手机上网......");
    }
}
抽象部分
/**
 * 角色(Abstraction,由RefinedAbstraction继承来扩展)
 */
public abstract class Brand {
    protected Phone phone;

    public Brand(Phone phone){
        this.phone = phone;
    }

    public void call(){
        phone.call();
    }

    public void connectInternet(){
        phone.connectInternet();
    }
}
public class Apple extends Brand{

    public Apple(Phone phone) {
        super(phone);
    }

    @Override
    public void call() {
        System.out.println("这是苹果手机");
        super.call();
    }

    @Override
    public void connectInternet() {
        System.out.println("这是苹果手机");
        super.connectInternet();
    }
}
public class XiaoMi extends Brand{

    public XiaoMi(Phone phone) {
        super(phone);
    }

    @Override
    public void call() {
        System.out.println("这是小米手机");
        super.call();
    }

    @Override
    public void connectInternet() {
        System.out.println("这是小米手机");
        super.connectInternet();
    }
}

测试类

public class Test {

    public static void main(String[] args) {
        Brand brand = new Apple(new Phone5G());
        brand.call();
        brand.connectInternet();

        Brand brand2 = new XiaoMi(new Phone2G());
        brand2.call();
        brand2.connectInternet();
    }
}

结果
桥接模式运行结果

jdbc源码应用

package com.mysql.cj.jdbc;

import java.sql.DriverManager;
import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
        // 此处通过静态代码块在初始化时就注册mysql的驱动
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

    public static synchronized void registerDriver(java.sql.Driver driver)
        throws SQLException {

        registerDriver(driver, null);
    }

    public static synchronized void registerDriver(java.sql.Driver driver,
            DriverAction da)
        throws SQLException {

        /* Register the driver if it has not already been added to our list */
        if(driver != null) {
            registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
        } else {
            // This is for compatibility with the original DriverManager
            throw new NullPointerException();
        }

        println("registerDriver: " + driver);

    }
public static Driver getDriver(String url)
        throws SQLException {

        println("DriverManager.getDriver(\"" + url + "\")");

        Class<?> callerClass = Reflection.getCallerClass();

        /**
        *此处通过DriverManager自己维护的CopyOnWriteArrayList<DriverInfo>                                 
        *registeredDrivers获取驱动连接信息,个人认为是桥接模式中的抽象部分,
        *实现部分是mysql的driver部分
        **/ 

        for (DriverInfo aDriver : registeredDrivers) {
            if(isDriverAllowed(aDriver.driver, callerClass)) {
                try {
                    if(aDriver.driver.acceptsURL(url)) {
                        // Success!
                        println("getDriver returning " + aDriver.driver.getClass().getName());
                    return (aDriver.driver);
                    }

                } catch(SQLException sqe) {
                    // Drop through and try the next driver.
                }
            } else {
                println("    skipping: " + aDriver.driver.getClass().getName());
            }

        }

        println("getDriver: no suitable driver");
        throw new SQLException("No suitable driver", "08001");
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值