GOF23设计模式-结构型模式3-桥接模式

21 篇文章 0 订阅
11 篇文章 0 订阅

桥接模式(Bridge Pattern)

  • 场景:商城系统中常见的商品分类,以电脑为例,如何良好的处理商品分类销售的问题?
  • 解决:可以通过多层继承结构实现,关系如下图:
    在这里插入图片描述
  • 问题:
    -扩展性问题(类个数膨胀)
    • 如果要增加一个新的电脑类型:智能手机,则要增加各个品牌下面的类;
    • 如果要增加一个新的电脑品牌:苹果,则要增加各个类型下面的类。
  • 违反单一职责原则
    -一个类:联想笔记本,又有两个引起这个类变化的原因——品牌(联想)和类型(笔记本)

这种方式的代码就不写了,它的UML类图如下所示,是一个三层继承关系:
在这里插入图片描述

  • 优化分析:将场景中的两个维度分开:品牌维度、类型维度,让其各自变化并不影响对方变化,而他们之间的关联关系则用“桥”来连接,如图:
    在这里插入图片描述

核心要点

  • 处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关系。新的类图大概如下,这样我们再左边电脑下面新增电脑类型Pad,它天然的具备品牌,在右边新加品牌,它也不影响电脑类型。
    在这里插入图片描述

代码实现

  1. 实现品牌接口及两个实现类
/**
 * User:tumbler
 * Desc:桥接模式--品牌接口
 */
public interface Brand {
    void sale();
}

/**
 * Desc:桥接模式--联想
 */
class Lenovo implements Brand {

    @Override
    public void sale() {
        System.out.println("销售联想电脑");
    }
}

/**
 * Desc:桥接模式--戴尔
 */
class Dell implements Brand {

    @Override
    public void sale() {
        System.out.println("销售戴尔电脑");
    }
}
  1. 实现电脑类型和其子类
/**
 * User:tumbler
 * Desc:桥接模式--电脑类型,具备品牌
 */
public class Computer {
    protected Brand brand;
    public Computer(Brand brand){
        this.brand = brand;
    }
    public void sale() {
        brand.sale();
    }
}

/**
 * 桥接模式--电脑类型,台式机
 */
class Desktop extends Computer {
    public Desktop(Brand brand) {
        super(brand);
    }
    @Override
    public void sale() {
        super.sale();
        System.out.println("销售台式机");
    }
}

/**
 * 桥接模式--电脑类型,笔记本
 */
class Laptop extends Computer {
    public Laptop(Brand brand) {
        super(brand);
    }
    @Override
    public void sale() {
        super.sale();
        System.out.println("销售笔记本");
    }
}
  1. 客户端测试类
/**
 * User:tumbler
 * Desc:桥接模式--客户端测试
 */
public class Client {
    public static void main(String[] args) {
        Computer computer = new Laptop(new Lenovo());
        computer.sale();
        //结果:
        //销售联想电脑
        //销售笔记本
    }
}

这样,我们就实现了多个维度的分离,新增一个电脑品牌,并不影响电脑类型,新增电脑类型,也不会影响电脑品牌;如果是多层继承的关系,将会有很多的类。
UML图:
在这里插入图片描述

开发常用应用场景

  • JDBC驱动程序
  • AWT中的Peer架构
  • 银行日志管理
    • 格式分类:操作日志,异常日志,交易日志
    • 距离分类:本地日志记录,异地日志记录
  • 人力资源系统中的奖金计算模块
    • 奖金分类:个人奖金,团体奖金,激励奖金
    • 部门分类:人事部门,研发部门,销售部门
  • OA系统中的消息处理
    • 业务类型:普通消息,加急消息,特急消息
    • 发送方式:系统内消息,短信,邮件

总结

  • 桥接模式可以取代多层继承的方案。多层继承违背了单一职责原则,复用性较差,累的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。
  • 桥接模式极大的提高了系统的可扩展性,在两个变化的维度中任意扩展其中一个维度,都不需要修改原有的系统,符合开闭原则。
目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象的实现 10 1.6.5 运用复用机制 13 1.6.6 关联运行时刻和编译时刻的 结构 15 1.6.7 设计应支持变化 16 1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第2章 实例研究:设计一个文档编 辑器 22 2.1 设计问题 23 2.2 文档结构 23 2.2.1 递归组合 24 2.2.2 图元 25 2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor和Composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory模式 35 2.6 支持多种窗口系统 35 2.6.1 我们是否可以使用Abstract Factory 模式 35 2.6.2 封装实现依赖关系 35 2.6.3 Window和WindowImp 37 2.6.4 Bridge 模式 40 2.7 用户操作 40 2.7.1 封装一个请求 41 2.7.2 Command 类及其子类 41 2.7.3 撤消和重做 42 2.7.4 命令历史记录 42 2.7.5 Command 模式 44 2.8 拼写检查和断字处理 44 2.8.1 访问分散的信息 44 2.8.2 封装访问和遍历 45 2.8.3 Iterator类及其子类 46 2.8.4 Iterator模式 48 2.8.5 遍历和遍历过程中的动作 48 2.8.6 封装分析 48 2.8.7 Visitor 类及其子类 51 2.8.8 Visitor 模式 52 2.9 小结 53 第3章 创建模式 54 3.1 Abstract Factory(抽象工厂)— 对象创建模式 57 3.2 Builder(生成器)—对象创建 模式 63 3.3 Factory Method(工厂方法)— 对象创建模式 70 3.4 Prototype(原)—对象创建 模式 87 3.5 Singleton(单件)—对象创建 模式 84 3.6 创建模式的讨论 89 第4章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型 模式 92 4.2 Bridge(桥接)—对象结构型 模式 100 4.3 Composite(组成)—对象结构型 模式 107 4.4 Decorator(装饰)—对象结构型 模式 115 4.5 FACADE(外观)—对象结构型 模式 121 4.6 Flyweight(享元)—对象结构型 模式 128 4.7 Proxy(代理)—对象结构型 模式 137 4.8 结构型模式的讨论 144 4.8.1 Adapter与Bridge 144 4.8.2 Composite、Decorator与Proxy 145 第5章 行为模式 147 5.1 CHAIN OF RESPONSIBIL ITY(职责链) —对象行为模式 147 5.2 COMMAND(命令)—对象行为 模式 154 5.3 INTERPRETER(解释器)—类行为 模式 162 5.4 ITERATOR(迭代器)—对象行为 模式 171 5.5 MEDIATOR(中介者)—对象行为 模式 181 5.6 MEMENTO(备忘录)—对象行为 模式 188 5.7 OBSERVER(观察者)—对象行为 模式 194 5.8 STATE(状态)—对象行为模式 201 5.9 STRATEGY(策略)—对象行为 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为模式 214 5.11 VISITOR(访问者)—对象行为 模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值