设计模式——桥梁模式

news2024/11/25 5:01:34

桥梁模式

定义

桥梁模式(Bridge Pattern)也叫做桥接模式。

将抽象和显示解耦,使得两者可以独立地变化。

优缺点、应用场景

优点

  1. 抽象和实现的解耦。
    这是桥梁模式的主要特点,它完全是为了解决继承的缺点而提出的设计模式。
  2. 优秀的拓展能力
    在例子中,如果山寨公司要生产新产品,只需要新建一个产品类,然后通过有参构造传给公司类即可。
  3. 屏蔽实现细节
    高层模型无需关心细节的实现。

应用场景

  1. 不希望使用继承的场景
  2. 接口或抽象类不稳定的场景。
  3. 重用性要求较高的场景。

代码模拟场景

公司都会先生产产品再做销售,有些公司会生产热门山寨产品,赚一波风口钱后就转向生产另一种商品。

非桥梁模式

小结

  1. 在公司抽象中,生产和销售都单独作为一个方法,即一个类只能实现一种商品的生产与销售。
  2. 当公司业务线变化后,需要修改公司类自身的代码逻辑,不利于拓展。

UML图

在这里插入图片描述

公司抽象和实现

/**
 * 公司 抽象
 */
public abstract class Corp {
	/**
	 * 生产产品
	 */
	protected abstract void produce();

	/**
	 * 销售产品
	 */
	protected abstract void sell();

	/**
	 * 核心工作——赚钱
	 */
	public void makeMoney() {
		// 先生产,后销售
		this.produce();
		this.sell();
	}
}

/**
 * 房产公司
 */
public class RealtyCorp extends Corp {
	static {
		System.out.println("=====房地产公司是这样运行的=====");
	}

	@Override
	protected void produce() {
		System.out.println("房地产公司盖房子...");
	}

	@Override
	protected void sell() {
		System.out.println("房地产公司买房子");
	}

	@Override
	public void makeMoney() {
		super.makeMoney();
		System.out.println("房地产公司赚大钱");
	}
}

/**
 * 服装公司
 */
public class ClothesCorp extends Corp {
	static {
		System.out.println("=====服装公司是这样运行的=====");
	}

	@Override
	protected void produce() {
		System.out.println("服装公司盖房子...");
	}

	@Override
	protected void sell() {
		System.out.println("服装公司买房子");
	}

	@Override
	public void makeMoney() {
		super.makeMoney();
		System.out.println("服装公司赚小钱");
	}
}

/**
 * IPod山寨公司
 */
public class IPodCorp extends Corp {
	static {
		System.out.println("=====山寨公公司是这样运行的=====");
	}

	@Override
	protected void produce() {
		System.out.println("我生产IPod...");
	}

	@Override
	protected void sell() {
		System.out.println("我销售IPod嘿嘿嘿...");
	}

	@Override
	public void makeMoney() {
		super.makeMoney();
		System.out.println("山寨也能赚...");
	}
}

入口类方法

private static void notBridgePattern() {
	// 房地产公司赚钱
	RealtyCorp realtyCorp = new RealtyCorp();
	realtyCorp.makeMoney();
	System.out.println();
	// 服装公司赚钱
	ClothesCorp clothesCorp = new ClothesCorp();
	clothesCorp.makeMoney();
	System.out.println();
	// 山寨公司赚钱
	IPodCorp iPodCorp = new IPodCorp();
	iPodCorp.makeMoney();
}

结果

在这里插入图片描述

桥梁模式

小结

  1. 桥梁模式中,引入产品作为桥梁,公司只需要专注于通过哪种产品赚钱
  2. 当公司经营的产品发生变化时,只需要修改、添加新的产品类即可

UML图

在这里插入图片描述

产品抽象和实现

/**
 * 产品 抽象
 */
public abstract class Product {
	/**
	 * 产品被生产出
	 */
	public abstract void beProduced();

	/**
	 * 产品被销售
	 */
	public abstract void beSell();
}

/**
 * 房子产品
 */
public class House extends Product {
	@Override
	public void beProduced() {
		System.out.println("生产房子咯....");
	}

	@Override
	public void beSell() {
		System.out.println("销售房子咯....");
	}
}

/**
 * IPod产品
 */
public class IPod extends Product {
	@Override
	public void beProduced() {
		System.out.println("生产出山寨IPod...");
	}

	@Override
	public void beSell() {
		System.out.println("销售山寨IPod...");
	}
}

公司抽象和实现

/**
 * 公司 抽象
 */
public abstract class Corp {
	/**
	 * 公司要有自己的产品
	 */
	private Product product;

	public Corp(Product product) {
		this.product = product;
	}

	/**
	 * 核心工作——赚钱
	 */
	public void makeMoney() {
		// 先生产,后销售
		this.product.beProduced();
		this.product.beSell();
	}
}

/**
 * 房产公司
 */
public class RealtyCorp extends Corp {
	static {
		System.out.println("=====房地产公司是这样运行的=====");
	}

	public RealtyCorp(Product product) {
		super(product);
	}

	@Override
	public void makeMoney() {
		super.makeMoney();
		System.out.println("房地产公司赚大钱");
	}
}

/**
 * IPod山寨公司
 */
public class IPodCorp extends Corp {
	static {
		System.out.println("=====山寨公公司是这样运行的=====");
	}

	public IPodCorp(Product product) {
		super(product);
	}

	@Override
	public void makeMoney() {
		super.makeMoney();
		System.out.println("山寨也能赚...");
	}
}

入口类方法

private static void bridgePattern() {
	// 房地产公司赚钱
	RealtyCorp realtyCorp = new RealtyCorp(new House());
	realtyCorp.makeMoney();
	// 山寨公司赚钱
	IPodCorp iPodCorp = new IPodCorp(new IPod());
	iPodCorp.makeMoney();
}

结果

在这里插入图片描述

参考书籍

秦小波《设计模式之禅》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/760663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从C到C++ | C++入门(二)

目录 缺省参数 1.)全缺省 2.)半缺省 函数重载 1.) 参数类型不同 2.) 参数个数不同 3.) 参数顺序不同 函数重载的原理: !!!注意 !!! 引用 1.) 引用做参数 2.) 引用做返回值 引用和…

C#使用DataGridView模拟绘图

接到一个需求,绘制一个水管线的图片,这种管线可以有12种分段方法,最后将这12种分段方法合并后在一条水管线上展示,要求: ⒈支持分段的属性展示; ⒉要求每个分段都能清晰展示,分段数在0&#xff…

一天吃透JVM面试八股文

内容摘自我的学习网站:topjavaer.cn 什么是JVM? JVM,全称Java Virtual Machine(Java虚拟机),是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回…

C++11(1)——新增用法零碎总结

目录 1. C11简介 2. 统一的列表初始化 2.1 {}初始化 2.2 std::initializer_list std::initializer_list是什么类型: std::initializer_list使用场景: 让模拟实现的vector也支持{}初始化和赋值 1. C11简介 在2003年C标准委员会…

【雕爷学编程】Arduino动手做(163)---大尺寸8x8LED方格屏模块2

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…

学无止境·MySQL⑧(Redis)

Redis和Mongodb练习 Redis1、安装redis2、string类型数据的命令操作:设置键值:读取键值数值类型自增1数值类型自减1查看值的长度 3、list类型数据的命令操作对列表city插入元素:Shanghai Suzhou Hangzhou将列表city里的头部的元素移除将name列…

AI炒股:用Claude来分析A股2023年中报业绩预告

Claude是和ChatGPT类似的AI大模型,据测试 AI 的水平能力接近 GPT-4,支持高达 100K token 的上下文。Claude只需要到官方网站注册账号后就可以直接免费使用。不过,目前智能美国和英国的 IP 可以注册和使用。 Claude支持上传文档功能&#xff…

计算机网络基础第三章

一、数据链路层功能概述 1.1 数据链路层基本概念 结点:主机、路由器 链路:网络中两个结点之间的物理通道,链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路 数据链路:网络中两个结点之间的逻辑通道,…

C++ 异常

文章目录 一. C语言的错误处理二. C的异常三. 异常的抛出与捕获1. 异常的抛出与匹配机制2. 在函数调用链中异常栈展开匹配原则3. 异常安全 四. 多态在异常中的应用五. C标准库的异常体系六. 异常规范七. 异常的优缺点结束语 一. C语言的错误处理 在C语言中,我们常见…

IDEA快捷键及模版配置

一、快捷键 1、常用的快捷键 删除当前行, 默认是 ctrl Y 自己配置 ctrl d (搜delete)复制当前行, 自己配置 ctrl alt 向下光标 (搜duplicate)补全代码 alt /添加注释和取消注释 ctrl / 【第一次是添加注释,第二次是取消注释】导入该行需要的类 先配置 auto …

S3C2440点亮LED(裸机开发)

文章目录 前言一、环境介绍一、GPIO介绍二、点亮开发板的LED1.预备动作2.led代码 总结 前言 本期和大家主要分享的是使用S3C2440开发板点亮一个LED灯,可能大家拿到开发板之后做的第一件事情都是点灯,这是为什么呢?因为点灯这件事情不仅能够检…

TCP三次握手调优

SYN: Synchronize Sequence Numbers。同步序列号 服务端的优化 当服务器收到 SYN 报文后,服务器会立刻回复 SYNACK 报文,既确认了客户端的序列号,也把自己的序列号发给了对方。此时,服务器端出现了新连接,状态是 SYN…

MySQL系列之行转列,列转行

MySQL系列之行转列,列转行 之前业务出现了需要行转列的场景,记录一下 SQL中AVG、COUNT、SUM、MAX等聚合函数对NULL值的处理 Mysql Max、 Where和 Group By 三个关键字同时使用 执行顺序 MySql 行转列的玩法 ,实战案例教学(MAX…

Eolink Apikit,0 代码可拖拽的自动化测试神器

目录 一、从测试到可拖拽的自动化测试二、0 代码,图形化,好用到飞起通过图形化操作、拖拽的方式搭建测试流程 三、Eolink Apikit,一站式 API 研发协作平台1、多协议支持2、多种数据重用3、报告、分析、告警4、支持持续集成和部署 四、Apikit …

QT基础入门之文件操作

一、概述 Qt 作为一个通用开发库,提供了跨平台的文件操作能力。Qt 通过QIODevice提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力。下面是 I/O 设备的类图: QIODevice:所有I/O设备类的父类,提供字节块读写的通…

Sentinel流量规则模块(降级)

sentinel的常见页面的简介 流控是对外部来的大流量进行控制,熔断降级的视角是对内部问题进行处理。 Sentinel降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,…

【JDBC系列】- jdbc的概念以及与数据库的交互流程

【JDBC系列】- jdbc的概念以及与数据库的交互流程 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页 怒放吧德德 To记录领地 🌝分享学习…

oc UITableView 列表

// // ViewController.m // OcDemoTest // // Created by Mac on 2023/7/14. //#import "ViewController.h" // 添加协议 interface ViewController ()<UITableViewDataSource> property (weak, nonatomic) IBOutlet UITableView *tableView;endimplementat…

Node中的的util.promisify()方法的介绍和基本实现

异步编程解决方案 我们知道&#xff0c;在JS中实现异步编程主要是通过以下几种方案&#xff1a; 回调函数&#xff1a;也是在ES6之前用的最多的方式&#xff0c;缺点是容易造成callback hell&#xff0c;可读性很差观察者模式&#xff1a;在NodeJS中的很多模块都继承了EventE…

二分搜索树节点删除

本小节介绍二分搜索树节点的删除之前&#xff0c;先介绍如何查找最小值和最大值&#xff0c;以及删除最小值和最大值。 以最小值为例&#xff08;最大值同理&#xff09;&#xff1a; 查找最小 key 值代码逻辑&#xff0c;往左子节点递归查找下去&#xff1a; ... // 返回以…