8.Bridge 桥接模式(结构型模式)

【1】抽象A==>实现细节b

【2】抽象A==>抽象B<==实现细节b

【3】【抽象B】==相对稳定,也可能变化   【实现细节b】==频繁变化

【4】抽象B 不稳定?

思考问题:一个变化是平台(抽象B)的变化,另一个变化是型号(实现细节b)的变化。

【抽象部分B】

public abstract class Tank
{protected TankPlatformImplementation tankImple;public Tank(TankPlatformImplementation tankImple){this.tankImple=tankImple;}public abstract void Shot();public abstract void Run(); public abstract void Trun();
}
public abstract class TankPlatformImplementation
{public abstract void MoveTankTO(Point to);//移动到某个点public abstract void DrawTank();          //画一个Tankpublic abstract void DoShot();            //播放声音,画出轨迹,特效等
}

 【实现细节b】各种实际实现通过继承来实现

public class T50:Tank { }
public class T75:Tank { }
public class T90:Tank { }

各种平台不同的实现: 

//PC                                   //Mobile
public class PCT50:T50 { }             public class MobileT50:T50 { }
public class PCT75:T75 { }             public class MobileT75:T75 { }
public class PCT90:T90 { }             public class MobileT90:T90 { }

软件加上时间轴,随着时间的变化,动态的创作软件系统。

using System;namespace ConsoleApp2
{internal class Tank_Factory{public static void Main() {TankPlatformImplementation tankImpl = new MobileTankImplementation();T50 tank = new T50(tankImpl);tank.Show();tank.TankImpl = new MobileTankImplementation();tank.Show();Console.WriteLine(tank.ToString());Console.WriteLine("Tank_Factory01");Console.ReadLine();}}public class Point{}//--Tank------------public abstract class Tank{protected TankPlatformImplementation tankImpl;protected Tank(TankPlatformImplementation tankImpl){this.tankImpl = tankImpl;}public TankPlatformImplementation TankImpl{get { return this.tankImpl; }set { this.tankImpl = value; }}public abstract void Show();public abstract void Run();public abstract void Stop();}//--TankPlatformImplementation------------public abstract class TankPlatformImplementation{public abstract void MoveTank(Point to);public abstract void DrawTank();public abstract void DoShot();}//--PCTankImplementation------------------public class PCTankImplementation : TankPlatformImplementation{public override void DoShot(){Console.WriteLine("PCTankImplementation");}public override void DrawTank(){}public override void MoveTank(Point to){}}//--MobileTankImplementation--------------public class MobileTankImplementation : TankPlatformImplementation{public override void DoShot(){Console.WriteLine("MobileTankImplementation");}public override void DrawTank(){}public override void MoveTank(Point to){}}//--T50-------------public class T50 : Tank{public T50(TankPlatformImplementation tankImpl) : base(tankImpl){}public override void Run(){tankImpl.MoveTank(new Point());}public override void Show(){tankImpl.DoShot();}public override void Stop(){tankImpl.DrawTank();}}//--T75-------------public class T75 : Tank{public T75(TankPlatformImplementation tankImpl) : base(tankImpl){}public override void Run(){tankImpl.MoveTank(new Point());}public override void Show(){tankImpl.DoShot();}public override void Stop(){tankImpl.DrawTank();}}//--T90--------------public class T90 : Tank{public T90(TankPlatformImplementation tankImpl) : base(tankImpl){}public override void Run(){tankImpl.MoveTank(new Point());}public override void Show(){tankImpl.DoShot();}public override void Stop(){tankImpl.DrawTank();}}//--PCT50--------------public class PCT50 : T50{public PCT50(TankPlatformImplementation tankImpl) : base(tankImpl){}public override void Run(){tankImpl.MoveTank(new Point());}public override void Show(){tankImpl.DoShot();}public override void Stop(){tankImpl.DrawTank();}}//--PCT75--------------public class PCT75 : T75{public PCT75(TankPlatformImplementation tankImpl) : base(tankImpl){}public override void Run(){tankImpl.MoveTank(new Point());}public override void Show(){tankImpl.DoShot();}public override void Stop(){tankImpl.DrawTank();}}//--PCT90--------------public class PCT90 : T90{public PCT90(TankPlatformImplementation tankImpl) : base(tankImpl){}public override void Run(){tankImpl.MoveTank(new Point());}public override void Show(){tankImpl.DoShot();}public override void Stop(){tankImpl.DrawTank();}}//--MobileT50-------------public class MobileT50 : T50{public MobileT50(TankPlatformImplementation tankImpl) : base(tankImpl){}public override void Run(){tankImpl.MoveTank(new Point());}public override void Show(){tankImpl.DoShot();}public override void Stop(){tankImpl.DrawTank();}}//--MobileT75-------------public class MobileT75 : T75{public MobileT75(TankPlatformImplementation tankImpl) : base(tankImpl){}public override void Run(){tankImpl.MoveTank(new Point());}public override void Show(){tankImpl.DoShot();}public override void Stop(){tankImpl.DrawTank();}}//--MobileT90-------------public class MobileT90 : T90{public MobileT90(TankPlatformImplementation tankImpl) : base(tankImpl){}public override void Run(){tankImpl.MoveTank(new Point());}public override void Show(){tankImpl.DoShot();}public override void Stop(){tankImpl.DrawTank();}}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp2
{internal class Program{static void Main(string[] args){ImageImp temp1 = new LinuxImp();ImageImp temp = new WindowImp();Image imp = new JPGImage();imp.SetImageImp(temp);imp.Show("zhongguo");Image imp1= new PNGImage();imp1.SetImageImp(temp1);imp1.Show("zhongguo");Console.WriteLine("Program02--------------");Console.ReadLine();}}//-----------------------------------------------public class Matix{public int x;public int y;public Matix(int x, int y){this.x = x;this.y = y;}}public abstract class ImageImp { public abstract void DoPaint(Matix m); }public class WindowImp : ImageImp{public override void DoPaint(Matix m){Console.WriteLine("在window系统中显示图像。");}}public class LinuxImp : ImageImp{public override void DoPaint(Matix m){Console.WriteLine("在Linux系统中显示图像。");}}public class UnixxImp : ImageImp{public override void DoPaint(Matix m){Console.WriteLine("在Linux系统中显示图像。");}}public abstract class Image {protected ImageImp imageImp;public void SetImageImp(ImageImp imageImp) { this.imageImp = imageImp; }public abstract void Show(string s);}public class JPGImage : Image{public override void Show(string s){imageImp.DoPaint(new Matix(10, 20));Console.WriteLine("JpgImp---");}}public class PNGImage : Image{public override void Show(string s){imageImp.DoPaint(new Matix(10, 30));Console.WriteLine("PNGImp---");}}//----------------------------------------------public abstract class Implemetor//实施者{public abstract void OperationImpl();//活动,业务}public class ConcreteImplementor : Implemetor{public override void OperationImpl(){throw new NotImplementedException();}}public abstract class Abstraction {protected Implemetor impl; //定义实现类接口对象public void SetImpl(Implemetor impl) {this.impl = impl;}public abstract void Operation();//声明抽象业务方法}public class RefinedAbstraction : Abstraction{public override void Operation(){impl.OperationImpl(); //调用实现类代码}}}

struct:

--------------------------------------------------------------------------------------------------------------------------------

桥接模式意图定义:将抽象部分与它他的实现部分解耦,使得两者都能够独立变化。--(GoF)

---------------------------------------------------------------------------------------------------------------------------------

将一个事务中多个维度的变化分离

【A】:使用对象间的组合关系,解耦了抽象和实现之间固有的绑定关系,使得抽象(tank)和实现(不同的平台)可以沿着各自的维度来变化。

【B】:所谓抽象和实现沿着各自的维度变化,即“子类化”他们,比如不同的Tank型号是子类变化,和不同的平台也是子类变化。得到各个子类之后,便可以任意组合它们,从而获得不同平台上的不同型号。

【C】:桥有时候类似于继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。桥模式是比多继承方案更好的解决方法。

【D】:桥模式应用一般在两个非常强的变化维度,有时候即使有两个变化的维度,但是某一个方向的变化维度并不剧烈,换言之两个变化不会导致纵横交错的结果。并不一定要使用桥模式。

组合优于继承。

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

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

相关文章

STM32程序发生异常崩溃时,怎样从串口输出当时的程序调用栈等信息

当STM32程序发生异常崩溃时&#xff0c;为了从串口输出当时的程序调用栈信息&#xff0c;并使用Keil等工具确定具体的函数信息&#xff0c;你可以按照以下步骤操作&#xff1a; 启用调试信息输出&#xff1a; 在STM32程序中&#xff0c;你需要先确保启用了调试信息的输出。这通…

【PyQt】如何在mainwindow中添加菜单栏

[toc]如何在mainwindow中添加菜单栏 如何在mainwindow中添加菜单栏 主要有两种方法&#xff1a; 1.直接创建mainwindow进行添加 2.使用ui文件加载添加 第二种方法更为常见&#xff0c;可以应用到实际 1.直接创建mainwindow进行添加 import sysfrom PyQt5.QtWidgets import …

基于springboot+vue+微信小程序的宠物领养系统

基于springbootvue微信小程序的宠物领养系统 一、介绍 本项目利用SpringBoot、Vue和微信小程序技术&#xff0c;构建了一个宠物领养系统。 本系统的设计分为两个层面&#xff0c;分别为管理层面与用户层面&#xff0c;也就是管理者与用户&#xff0c;管理权限与用户权限是不…

【Rust】错误处理机制

目录 思维导图 引言 一、错误处理的重要性 1.1 软件中的错误普遍存在 1.2 编译时错误处理要求 二、错误的分类 2.1 可恢复错误&#xff08;Recoverable Errors&#xff09; 2.2 不可恢复错误&#xff08;Unrecoverable Errors&#xff09; 三、Rust 的错误处理机制 3…

Spring Boot教程之五十五:Spring Boot Kafka 消费者示例

Spring Boot Kafka 消费者示例 Spring Boot 是 Java 编程语言中最流行和使用最多的框架之一。它是一个基于微服务的框架&#xff0c;使用 Spring Boot 制作生产就绪的应用程序只需很少的时间。Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序&#xff0c;您可…

金融项目实战 04|JMeter实现自动化脚本接口测试及持续集成

目录 一、⾃动化测试理论 二、自动化脚本 1、添加断言 1️⃣注册、登录 2️⃣认证、充值、开户、投资 2、可重复执行&#xff1a;清除测试数据脚本按指定顺序执行 1️⃣如何可以做到可重复执⾏&#xff1f; 2️⃣清除测试数据&#xff1a;连接数据库setup线程组 ①明确…

linux下中文输入法ibus

在Linux系统中&#xff0c;现在都自带ibus框架&#xff0c;可以选择中文输入法&#xff0c;如果使用IBus输入法时无法输入中文&#xff0c;可以尝试以下几种方法来解决这个问题&#xff1a; 1. 检查环境变量 确保环境变量配置正确。可以在终端中运行以下命令来设置环境变量&a…

【Uniapp-Vue3】@import导入css样式及scss变量用法与static目录

一、import导入css样式 在项目文件中创建一个common文件夹&#xff0c;下面创建一个css文件夹&#xff0c;里面放上style.css文件&#xff0c;编写的是公共样式&#xff0c;我们现在要在App.vue中引入该样式。 在App.vue中引入该样式&#xff0c;这样就会使样式全局生效&#…

大疆机场及无人机上云

最近基于大疆上云api进行二次开发&#xff0c;后面将按照开发步骤对其进行说明&#xff01;

WINFORM - DevExpress -> gridcontrol---->主从模式

1.gridview设置 //不显示分组的面板gridView1.OptionsView.ShowGroupPanel = false;//自动改变行高适应内容 gridView1.OptionsView.RowAutoHeight = true;//允许自动合并单元格 gridView1.OptionsView.AllowCellMerge = true;//如果主从表中,没有找到从表内容也要显示(默认是…

Golang笔记——hashmap

本文详细介绍golang的哈希表的底层实现、扩容机制、插入查询过程以及并发安全性。 文章目录 定义Key无序性Key唯一性Key可比性 基本使用底层实现哈希表实现hmapbucket 数据结构bmap链地址法哈希冲突负载因子 扩容增量扩容等量扩容 查找过程插入过程删除流程非并发安全map 的线程…

【网络】:网络编程套接字

目录 源IP地址和目的IP地址 源MAC地址和目的MAC地址 源端口号和目的端口号 端口号 VS 进程ID TCP协议和UDP协议 网络字节序 字符串IP和整数IP相互转换 查看当前网络的状态 socket编程接口 socket常见API 创建套接字&#xff08;socket&#xff09; 绑定端口号&…

el-descriptions-item使用span占行不生效

需要实现的效果是客户状态单独占满一行 错误代码&#xff1a; <el-descriptions title"基本信息" :column"3"> <el-descriptions-item label"公司电话:">Suzhou</el-descriptions-item><el-descriptions-item label"…

vue城市道路交通流量预测可视化系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站、收藏、不迷路&#xff01; 项目亮点 编号&#xff1a;R09 &#x1f687; 网站大屏管理三大前端、vuespringbootmysql、前后端分离架构 &#x1f687; 流量预测道路查询…

Elasticsearch:使用 Playground 与你的 PDF 聊天

LLMs作者&#xff1a;来自 Elastic Toms Mura 了解如何将 PDF 文件上传到 Kibana 并使用 Elastic Playground 与它们交互。本博客展示了在 Playground 中与 PDF 聊天的实用示例。 Elasticsearch 8.16 具有一项新功能&#xff0c;可让你将 PDF 文件直接上传到 Kibana 并使用 Pla…

[免费]SpringBoot+Vue新能源汽车充电桩管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue新能源汽车充电桩管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue新能源汽车充电桩管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息化时代的到来&#xff0…

《拉依达的嵌入式\驱动面试宝典》—操作系统篇(二)

《拉依达的嵌入式\驱动面试宝典》—操作系统篇(二) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…

ffmpeg7.0 aac转pcm

#pragma once #define __STDC_CONSTANT_MACROS #define _CRT_SECURE_NO_WARNINGSextern "C" { #include "libavcodec/avcodec.h" }//缓冲区大小&#xff08;缓存5帧数据&#xff09; #define AUDIO_INBUF_SIZE 40960 /*name depthu8 8s16 …

【Uniapp-Vue3】pages.json页面路由globalStyle的属性

项目的全局配置在pages.json中。 一、导航栏设置 二、下拉刷新设置 下拉就可以看到设置的样式 三、上拉触底 这个页面中&#xff0c;向下滑动页面到底部就会输出“到底了” 现在将触底距离设置为500 走到半路就会输出“到底了”

openGauss 6.0 LTS 实现高可用性部署

openGauss 6.0 LTS是华为开发的企业级分布式数据库&#xff1a;高性能、高可用性、强扩展性&#xff0c;基于PostgreSQL&#xff0c;支持SQL和JSON数据类型&#xff0c;提供高并发、高吞吐量的处理能力&#xff0c;适合金融、电信、政府等行业使用&#xff0c;6.0版本主要增强了…