Java设计模式之桥接模式

本文介绍桥接模式,一种结构型设计模式,通过分离抽象层与实现层使两者能独立变化。适用于解决多继承带来的类膨胀问题,提高系统的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

桥接模式

Bridge

定义: 桥接模式将抽象层与实现层分离,使得抽象层和实现层可以独立变化

引入桥接模式

项目要求: 对不同手机品牌的不同功能进行编程

方案一 继承

在这里插入图片描述

当要添加其他品牌手机或添加其他功能,会变得非常复杂

手机品牌与手机功能存在强耦合

桥接模式简介

定义: 桥接模式是一种结构型模式,使用合成复用原则将实现层和抽象层分离解耦,使得实现层与抽象层可以独立改变

比如: 蜡笔与毛笔,它们都有颜色和型号,实现3种型号和3种颜色,蜡笔需要9支(3x3),毛笔只需要3支(要什么颜色就用毛笔去蘸什么颜色的墨水),蜡笔就是颜色和型号强耦合

角色

  • 实现部分
    • Implementor 实现化角色 接口
    • ConcreteImplementor 具体实现化角色 接口的实现类
  • 抽象部分
    • Abstraction 抽象化角色 抽象类 (被客户端调用)
    • RefinedAbstraction 修正抽象化角色 继承抽象类

大话设计模式结构图

在这里插入图片描述

使用桥接模式代替继承方案

可以将手机品牌看成抽象部分,手机功能看成实现部分

使用合成复用原则(尽量使用聚合而不用继承)进行松耦合

在这里插入图片描述

增加新手机品牌就去继承抽象化角色,增加新功能就去实现实现化角色 实现松耦合

实现部分指的是 抽象化实现类用来实现自己的对象 (打电话/玩游戏 是 华为/一加手机用来实现自己的对象)

使用桥接模式的代码

结构图

在这里插入图片描述

Implementor

/**
 * @author Tc.l
 * @Date 2021/1/28
 * @Description:手机功能
 */
public interface Implementor {
    //作用
    void effect();
}

ConcreteImplementor

/**
 * @author Tc.l
 * @Date 2021/1/29
 * @Description:手机功能实现类A打电话
 */
public class ConcreteImplementorA implements Implementor{
    @Override
    public void effect() {
        System.out.print("打电话");
    }
}
/**
 * @author Tc.l
 * @Date 2021/1/29
 * @Description:手机功能实现类B玩游戏
 */
public class ConcreteImplementorB implements Implementor{
    @Override
    public void effect() {
        System.out.print("玩游戏");
    }
}

Abstraction

/**
 * @author Tc.l
 * @Date 2021/1/29
 * @Description:手机品牌
 */
public abstract class Abstraction {
    private Implementor implementor;

    public Abstraction(Implementor implementor) {
        this.implementor = implementor;
    }

    public Abstraction() {
    }

    public void setImplementor(Implementor implementor) {
        this.implementor = implementor;
    }

    public void effect(){
        implementor.effect();
    }
}

RefinedAbstraction

/**
 * @author Tc.l
 * @Date 2021/1/29
 * @Description:手机品牌抽象化的实现--华为手机
 */
public class RefinedAbstractionA extends Abstraction{
    public RefinedAbstractionA(Implementor implementor) {
        super(implementor);
    }

    public RefinedAbstractionA() {
    }

    @Override
    public void effect() {
        super.effect();
        System.out.println(" (华为手机)");
    }
}
/**
 * @author Tc.l
 * @Date 2021/1/29
 * @Description:手机品牌抽象化的实现--一加手机
 */
public class RefinedAbstractionB extends Abstraction{
    public RefinedAbstractionB(Implementor implementor) {
        super(implementor);
    }

    public RefinedAbstractionB() {
    }

    @Override
    public void effect() {
        super.effect();
        System.out.println(" (一加手机)");
    }
}

Client

/**
 * @author Tc.l
 * @Date 2021/1/29
 * @Description:
 */
public class Client {
    public static void main(String[] args) {
        //实现
        //打电话
        Implementor call = new ConcreteImplementorA();
        //玩游戏
        Implementor game = new ConcreteImplementorB();

        //抽象
        //华为手机
        Abstraction huaweiPhone = new RefinedAbstractionA(call);
        //一加手机
        Abstraction yijiaPhone = new RefinedAbstractionB(call);

        huaweiPhone.effect();
        yijiaPhone.effect();

        huaweiPhone.setImplementor(game);
        yijiaPhone.setImplementor(game);

        huaweiPhone.effect();
        yijiaPhone.effect();
    }
}
/*
打电话 (华为手机)
打电话 (一加手机)
玩游戏 (华为手机)
玩游戏 (一加手机)
*/

总结

特点

  • 桥接模式常用于代替多层继承,减少子类的个数
  • 将抽象层与实现层分离, 实现层聚合在抽象层中

使用场景

桥接模式适用于不希望使用多重继承导致拥有大量类的系统 (合成复用原则: 聚合代替继承)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值