设计模式——桥梁模式

桥梁模式

定义

桥梁模式(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();
}

结果

在这里插入图片描述

参考书籍

秦小波《设计模式之禅》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

声音生成项目(6)——在矢量量化变分编码器上使用自回归模型PixelCNN模型生成新的样本

文章目录 引言PixelCNN论文简读模型介绍自回归模型PixelCNN模型结构 基础知识回顾 代码实现PixelConvLayer具体运行过程卷积模块整体网络结构 模型执行效果问题解决训练好的模型在生成新的图片时,为什么要逐个元素进行生成?掩码卷积仅仅是考虑了一部分的…

R语言实现SMOTE与SMOGN算法解决不平衡数据的回归问题

本文介绍基于R语言中的UBL包,读取.csv格式的Excel表格文件,实现SMOTE算法与SMOGN算法,对机器学习、深度学习回归中,训练数据集不平衡的情况加以解决的具体方法。 在之前的文章Python实现SMOGN算法解决不平衡数据的回归问题&#x…

Spring初识(二)

前言 经过前面的学习,我们已经知道spring就是包含了众多方法的Ioc,那么既然是容器,就具备两个功能,我们接下来就是要介绍以下两个功能: 1.将对象存储到容器(spring)中: 2.从容器(spring)中将对象取出来. 这两个功能就应发出来,spring的创建和使用. 一.Spring创建 我们先来说…

Ubuntu关闭自动休眠

一、查看当前休眠模式 使用systemctl status sleep.target 命令查看当前休眠模式,结果如下图,sleep状态为enabled,表示自动休眠模式开启。 二、关闭自动休眠模式 使用sudo systemctl mask sleep.target suspend.target 关闭休眠模式 三…

面向初学者的卷积神经网络

卷积神经网络在机器学习中非常重要。如果你想做计算机视觉或图像识别任务,你根本离不开它们。但是很难理解它们是如何工作的。 在这篇文章中,我们将讨论卷积神经网络背后的机制、它的优点和应用领域。 什么是神经网络? 首先,让…

【ACM】—蓝桥杯大一暑期集训Day2

🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前正在学习C/C、Java、算法等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:CSTL&#xff…

MySQL-分库分表详解(二)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

Xcode报错--访问keychain,出现弹窗处理方案

情景 访问keychain弹出弹窗&#xff0c;不想人工点击&#xff0c;比如自动化测试中使用keychain中的证书的情况 原因 Mac的保护机制 处理 1、人工&#xff1a;输入Password&#xff0c;点击Allow或者Always Allow 2、命令行处理 security unlock-keychain -p "<…

Spring Batch之读数据库——JdbcCursorItemReader之自定义PreparedStatementSetter(三十八)

一、自定义PreparedStatementSetter 详情参考我的另一篇博客&#xff1a; Spring Batch之读数据库——JdbcCursorItemReader&#xff08;三十五&#xff09;_人……杰的博客-CSDN博客 二、项目实例 1.项目实例 2.代码实现 BatchMain.java&#xff1a; package com.xj.dem…

docker的安装以及常用命令详解

目录 一、docker简介 二、docker安装 三、常用命令 1、显示 Docker 版本信息 2、显示 Docker 系统信息&#xff0c;包括镜像和容器数 3、帮助 四、镜像管理 1、列出镜像 2、获取一个新的镜像 3、查找镜像 4、删除镜像 5、镜像导入与导出 五、容器生命周期 1、运行…

小程序form表单验证,validate 在更新数据以后不能验证?还是提示同样的错误

报错&#xff1a; 一直报手机号码必须填写&#xff0c;但是我已经填写了。 解决&#xff1a; 花了2个小时&#xff0c;最后发布是模式models写错了。 改完之后&#xff0c;终于提示别的错误了&#xff1a; 源码&#xff1a; //wxml <view class"welcome">欢…

安装Visual Studio Installer Projects 2022插件

VS主界面--扩展--管理扩展--搜索VS插件“Visual Studio Installer Projects 2022”并安装。

【多模态】1、几种多模态 vision-language 任务和数据集介绍

文章目录 一、Phrase Grounding1.1 概念介绍1.2 常用数据集介绍 二、Referring Expression Comprehension&#xff08;REC&#xff09;2.1 概念介绍2.2 常用数据集介绍 三、Visual Question Answer&#xff08;VQA&#xff09;3.1 概念介绍 四、Image Caption4.1 概念介绍 现在…

cookie 生命周期和cookie有效路径超级详细讲解

文章目录 cookie 生命周期和cookie有效路径超级详细讲解cookie 生命周期介绍代码示例完成测试 , 注意抓包看数据 cookie 有效路径有效路径规则规则如下:代码示例完成测试 , 注意抓包看创建 Cookie 时,返回的数据完成测试 , 注意抓包看读取 Cookie 时,返回的数据 代码示例html页…

bug:file name too long文件名超出系统最大限制

各操作系统支持最长的文件和目录名称长度&#xff08;Linux、Win、Mac&#xff09; 今天开发需求的时候发现无法新建文件&#xff0c;提示file name too lang&#xff0c;于是翻阅和查询了一些资料&#xff0c;发现不同操作系统下文件名和目录名最长的长度不同。 操作系统文件名…

elementUI 非表单格式的校验

在普通表单中对输入框、选择框都有校验案例。 但是在自定义非空中如何进行校验官网并没有说明 关键代码 clearValidate 方法清除校验 this.$refs.formValue.clearValidate(signinimg) 使用案例 <template><div class"stylebg"><Tabs icons"el-…

.net6中WPF的串口通信和USB通信

之前写过串口通信&#xff0c;不过是winform的。 c#使用串口进行通信_c# 串口通信_故里2130的博客-CSDN博客 今天说一下&#xff0c;.net6中wpf的串口通信和USB通信&#xff0c;在工控行业中&#xff0c;这2种的方式非常多&#xff0c;还有网口通信&#xff0c;它们都是用来和…

利用ChatGPT场景化学习英语听说读写

大家好&#xff0c;我是可夫小子&#xff0c;关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加我&#xff0c;备注&#xff1a;chatgpt&#xff0c;拉你进群。 我们从初中就开始学习英语&#xff0c;到大学也有小十年&#xff0c;在这个过程中&#xff0c;我们投入了很…

提高驾驶安全性 | 基于ACM32 MCU的胎压监测仪方案

概述 作为车辆的基础部件&#xff0c;轮胎是影响行车安全不可忽视的因素之一。据统计&#xff0c;中国每年由胎压问题引起轮胎爆炸的交通事故约占 30%&#xff0c;其中 50%的高速交通事故是由车辆胎压异常引起。因此&#xff0c;准确实时地监测车辆在行驶过程中的轮胎压监测系…

Java List中通过对象属性排序,可实现多条件排序

直接上代码&#xff1a; import com.google.common.collect.Lists; import lombok.AllArgsConstructor; import lombok.Data;import java.util.Comparator; import java.util.List; import java.util.stream.Collectors;/*** List 对象属性排序*/Data AllArgsConstructor clas…