设计模式(6):桥接模式

一.桥接模式核心要点

  • 处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关系。 \color{red}{处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关系。} 处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关系。

二.桥接模式实际开发中应用的场景

  • JDBC驱动程序
  • OA系统中的消息处理:
    • 业务消息:普通消息、加急消息、特急消息
    • 发送消息方式:系统内消息、手机短信、邮件
  • 银行日志管理
    • 格式分类: 操作日志、交易日志、异常日志
    • 距离分类:本地记录日志、异地记录日志

三.桥接模式举例讲解

1.业务:

  • 商城系统中常见的商品分类,以电脑为例,电脑类型分为台式电脑、平板电脑、笔记本电脑,电脑品牌分为华硕、戴尔、联想等等,具体类型可能是'华硕台式电脑',这个业务存在两个维度变化,那么如何良好的处理商品分类销售的问题?

2.不使用桥接模式:

  • 我们可以使用多继承结构实现,这个时候存在两个维度变化,就会形成笛卡尔积。
    • 类个数膨胀问题:
      • 如果要增加一个新的电脑类型,则要增加各个品牌下面的类;
      • 如果要增加一个品牌,也要增加各种电脑类型的类。
    • 违法单一职责原则:
      • 一个类,联想笔记本,有两个引起这个类变化的因素,违法单一职责原则

3.桥接模式实现:

    (1)电脑类型接口与实现类型

java 复制代码
 /**
    * 电脑类型
    */
   public interface Computer {
		String getTypeName();
	}
	public class Laptop implements Computer{
		@Override
		public String getTypeName() {
			return "笔记本电脑";
		}
	}
	public class Desktop implements Computer{
		@Override
		public String getTypeName() {
			return "台式电脑";
		}
	}
	/**
	 * 可以随意添加,不会影响其他类
	 */
	/*public class Aad implements Computer{
		@Override
		public String getTypeName() {
			return "平板电脑";
		}
	}*/

    (2)电脑品牌抽象类与实现类

java 复制代码
 /**
  * 品牌
  */
 public abstract class Brand {
	Computer computer;
	
	public Brand(Computer computer) {
		this.computer = computer;
	}
	
	public abstract String getBrand();
	
	public void operation() {
		System.out.println(getBrand()+computer.getTypeName());
	}
}
/**
 * 华硕电脑
 */
public class ASUS extends Brand{
	public ASUS(Computer computer) {
		super(computer);
	}
	@Override
	public String getBrand() {
		return "华硕";
	}
}
/**
 * 戴尔电脑
 */
public class Dell extends Brand{
	public Dell(Computer computer) {
		super(computer);
	}
	@Override
	public String getBrand() {
		return "戴尔";
	}
}
/**
 * 联想电脑
 */
public class Lenovo extends Brand{
	public Lenovo(Computer computer) {
		super(computer);
	}
	@Override
	public String getBrand() {
		return "联想";
	}
}

/**
 * 可以随意添加,不会影响其他类
 */
/*public class Shenzhou extends Brand{
	public Shenzhou(Computer computer) {
		super(computer);
	}
	@Override
	public String getBrand() {
		return "神州";
	}
}*/

    (3)桥接模式调用

java 复制代码
/**
 * 桥接模式:可以取代多层继承的方案!
 *
 */
public class App {
	public static void main(String[] args) {
		Brand c = new Dell(new Desktop());
		c.operation();
	}
}

四.桥接模式总结:

  • 桥接模式可以取代多层继承关系。多层继承关系违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。 \color{red}{桥接模式可以取代多层继承关系。多层继承关系违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。} 桥接模式可以取代多层继承关系。多层继承关系违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。
  • 桥接模式极大的提高了系统可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则。 \color{red}{桥接模式极大的提高了系统可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则。} 桥接模式极大的提高了系统可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则。

更多设计模式学习:

设计模式(1):介绍

设计模式(2):单例模式

设计模式(3):工厂模式

设计模式(4):建造者模式

设计模式(5):原型模式

设计模式(7):装饰器模式

设计模式持续更新中...

相关推荐
paopaokaka_luck11 分钟前
基于SpringBoot+Vue的非遗文化传承管理系统(websocket即时通讯、协同过滤算法、支付宝沙盒支付、可分享链接、功能量非常大)
java·数据库·vue.js·spring boot·后端·spring·小程序
iteye_993913 分钟前
让 3 个线程串行的几种方式
java·linux
YuTaoShao20 分钟前
【LeetCode 热题 100】142. 环形链表 II——快慢指针
java·算法·leetcode·链表
找不到、了1 小时前
分布式理论:CAP、Base理论
java·分布式
天天摸鱼的java工程师1 小时前
2025已过半,Java就业大环境究竟咋样了?
java·后端
人生在勤,不索何获-白大侠1 小时前
day16——Java集合进阶(Collection、List、Set)
java·开发语言
Zedthm1 小时前
LeetCode1004. 最大连续1的个数 III
java·算法·leetcode
艺杯羹2 小时前
MyBatis之核心对象与工作流程及SqlSession操作
java·mybatis
神的孩子都在歌唱2 小时前
3423. 循环数组中相邻元素的最大差值 — day97
java·数据结构·算法
喜欢吃豆2 小时前
深入企业内部的MCP知识(三):FastMCP工具转换(Tool Transformation)全解析:从适配到增强的工具进化指南
java·前端·人工智能·大模型·github·mcp