首页 > 其他分享 >设计模式——桥接模式

设计模式——桥接模式

时间:2024-07-16 16:28:49浏览次数:18  
标签:桥接 void System 模式 println 手机 设计模式 public out

设计模式——桥接模式

1.概述

现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系:
概述

我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统,我们此时可以考虑使用桥接模式。
定义:
将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

2.基本介绍

  1. 桥接模式(Bridge 模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。
    是一种结构型设计模式
  2. Bridge 模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要
  3. 特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展

3.结构

桥接(Bridge)模式包含以下主要角色:
抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。
扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。
具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。

4.案例

使用桥接模式对应的类图
案例

4.1 代码实现

接口

public interface Brand {
    void open();

    void close();

    void call();
}

抽象组合类

public abstract class Phone {
    private Brand brand;

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

    void open() {
        this.brand.open();
    }

    void close() {
        this.brand.close();
    }

    void call() {
        this.brand.call();
    }
}
public class UpRightPhone extends Phone {
    public UpRightPhone(Brand brand) {
        super(brand);
    }

    @Override
    void open() {
        super.open();
        System.out.println("直立样式手机");
    }

    @Override
    void close() {
        super.close();
        System.out.println("直立样式手机");
    }

    @Override
    void call() {
        super.call();
        System.out.println("直立样式手机");
    }
}
public class FoldedPhone extends Phone {

    public FoldedPhone(Brand brand) {
        super(brand);
    }

    @Override
    void open() {
        super.open();
        System.out.println("折叠样式手机");
    }

    @Override
    void close() {
        super.close();
        System.out.println("折叠样式手机");
    }

    @Override
    void call() {
        super.call();
        System.out.println("折叠样式手机");
    }
}

接口实现类

public class XiaoMi implements Brand{
    public void open() {
        System.out.println("XiaoMi手机开机");
    }

    public void close() {
        System.out.println("XiaoMi手机关机");
    }

    public void call() {
        System.out.println("XiaoMi手机打电话");
    }
}
public class Vivo implements Brand {
    public void open() {
        System.out.println("Vivo手机开机");
    }

    public void close() {
        System.out.println("Vivo手机关机");
    }

    public void call() {
        System.out.println("Vivo手机打电话");
    }
}

调用类:

public class Client {
    public static void main(String[] args) {
        Phone foldedPhone = new FoldedPhone(new XiaoMi());
        foldedPhone.open();
        foldedPhone.close();
        foldedPhone.call();

        Phone upRightPhone = new UpRightPhone(new Vivo());
        foldedPhone.open();
        upRightPhone.close();
        upRightPhone.call();
    }
}

打印结果:

XiaoMi手机开机
折叠样式手机
XiaoMi手机关机
折叠样式手机
XiaoMi手机打电话
折叠样式手机
XiaoMi手机开机
折叠样式手机
Vivo手机关机
直立样式手机
Vivo手机打电话
直立样式手机

4.2 注意事项

  1. 实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。
  2. 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。
  3. 桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。
  4. 桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程
  5. 桥接模式要求正确识别出系统中两个独立变化的维度(抽象、和实现),因此其使用范围有一定的局限性,即需要有这样的应用场景。

4.3 使用场景

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
  • 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

标签:桥接,void,System,模式,println,手机,设计模式,public,out
From: https://blog.csdn.net/weixin_46073538/article/details/140461239

相关文章

  • 三分钟了解共享门店模式
    共享店铺,作为一种创新的商业模式,正悄然改变着传统零售与服务业的格局。其核心思想在于构建一个开放共享的平台,将实体店铺内未充分利用的资源——包括工位、员工的专业技能、丰富的运营经验、乃至房屋水电等基础设施,转化为可共享的资产。这一模式巧妙地将拥有客户资源却缺乏实体......
  • 随机返模式使百货商城半年实现6千万业绩
    随机返模式使百货商城半年实现6千万业绩在当今竞争激烈的电商领域,一家百货商城凭借创新的“随机返”模式,在短短半年内实现了惊人的6000万业绩增长,这背后究竟隐藏着怎样的商业智慧与利润密码?这家商城打破了传统消费即止的观念,引入了一种前所未有的购物回馈机制:消费者在完成一......
  • 设计模式:代理模式详解
    需求场景按着惯例,还是以一个应用场景作为代理模式的切入点。现在有一个订单系统,要求是:一旦订单被创建,只有订单的创建人才可以修改订单中的数据,其他人则不能修改。基本实现思路按着最直白的思路,就是查询数据库中订单的创建人和当前Session中的登录账号ID是否一致。classOrde......
  • 【Vue3】4个比较重要的设计模式!!
        大家好,我是CodeQi! 一位热衷于技术分享的码仔。在我投身于前端开发的职业生涯期间,曾有一次承接了一个大型项目的维护工作。此项目运用的是Vue框架,然而其代码结构紊乱不堪,可维护性极度糟糕......
  • 木舟0基础学习Java的第十九天(装饰设计模式,转换流,对象操作流(序列化),Properties集合)
    装饰设计模式创建一个接口用一个类实现接口再创建一个类实现这个接口第二个类中包含第一个类中的方法和自己的方法还可以增强案例:publicinterfaceCar{publicvoidrun();publicvoidcarry();}publicclassTaxiimplementsCar{@Overridepub......
  • C语言 ——— 浮点数类型 在 内存中 的 存储模式
    浮点数存储规则根据国际标准IEEE754(电气和电子工程协会)规定:任意一个浮点数F的二进制都可以表示成以下形式:科学计数法(-1)^S*M*2^E解析科学计数法: 1.解析:(-1)^S(-1)^S 表示的是浮点数F的符号位当S=0时,原式=(-1)^0= 1,此时的 1就表示浮点数F为......
  • 设计模式之装饰模式(学习笔记)
    定义装饰模式(DecoratorPattern),又称为包装模式,是一种结构型设计模式。它允许在不改变现有对象结构的情况下,动态地添加新的功能。通过将每个功能封装在单独的装饰器类中,并且这些装饰器类通过引用原始对象来实现功能的组合,从而提供了灵活性和可扩展性的优势。装饰模式避免了通过继......
  • 游戏陪玩模式开发系统搭建
    游戏陪玩模式开发系统搭建通常涉及以下几个关键步骤:需求分析与设计:首先,进行详细的市场分析和用户需求调研,了解目标用户群体、竞争对手以及市场需求1。根据调研结果,设计游戏陪玩系统的整体架构、功能模块、用户界面等1。技术选型:选择适合的技术栈和开发框架,如移动应用开发......
  • 【从0到1进阶Redis】哨兵模式
    笔记内容来自B站博主《遇见狂神说》:Redis视频链接小伙伴们可以看一下上一篇我的Redis笔记——【从0到1进阶Redis】主从复制这样可以更好的理解原理。一、概述主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会......
  • 设计模式:使用闭包实现数据集加载过程的依赖倒转
    重点数据集和数据集使用到的参数可以保持不同,将这些不同放到配置文件中进行处理而不是修改获取数据集的加载代码,优点是:减少修改代码的出错统一数据加载的接口格式设计模式:使用闭包实现数据集加载过程的依赖倒转重点前言一、什么是装饰器1、装饰器的定义2、装饰器的使......