首页新闻博问专区闪存班级 我的博客我的园子账号设置退出登录注册登录BWH_Steven 博客园首页新随笔联系订阅管理随笔 - 112 文章 - 0 评论 - 20【设计模式】第七篇:和我一起简单认识桥接模式 【设计模式】第七篇:和我一起简单认识桥接模式 一 引言桥接模式理解起来也是非常简单,我们仍然从生活中的问题出发,如果一些事物的分类可以从两个或者多个维度来划分,就比如不同品牌和不同排量的汽车,他们可以有 M x N 种结果(例如:奥迪A8 2.0排量,奥迪A6 2.0排量,奔驰S350L 3.0排量,等等)这种情况下如果选择继承的方式,就会出现一种多层继承的关系,子类就会非常多,同时扩展也很麻烦像这样的例子还有很多,比如品牌和产品类型之间,或者不同颜色和字体的图形或者文字,等等二 桥接模式引入还是老规矩,直接用实际的代码例子引入背景:相机品牌(索尼,佳能等)和相机类型(单反,微单,卡片机等)两种维族的组合结果我们想要做的就是取消他们的继承关系,而使用组合先创建一个抽象的相机品牌类/**
-
相机品牌类
/
public interface CameraBrand {
void showInfo();
}
接着就是两个具体的实现类,这里举了索尼和佳能两个品牌/* -
索尼品牌
/
public class Sony implements CameraBrand {
@Override
public void showInfo() {
System.out.print("【索尼】");
}
}
/* -
佳能品牌
/
public class Canon implements CameraBrand {
@Override
public void showInfo() {
System.out.print("【佳能】");
}
}
下面再将相机产品类抽象出来,为了实现组合,引入相机品牌成员,为了能让在子类中也能访问到,我用了 protected/* -
抽象相机类
*/
public abstract class Camera {
// 将品牌组合进来
protected CameraBrand cameraBrand;public Camera(CameraBrand cameraBrand) {
this.cameraBrand = cameraBrand;
}public void showInfo(){
cameraBrand.showInfo();
}
}
下面就是两个相机的产品具体类型/** -
单反相机
*/
public class SlrCameras extends Camera {public SlrCameras(CameraBrand cameraBrand) {
super(cameraBrand);
}@Override
public void showInfo() {
super.showInfo();
System.out.println(“单反相机”);
}
}
/** -
卡片相机(数字相机)
*/
public class DigitalCamera extends Camera {public DigitalCamera(CameraBrand cameraBrand) {
super(cameraBrand);
}@Override
public void showInfo() {
super.showInfo();
System.out.println(“卡片相机(数字相机)”);
}
}
测试一下public class Test {
public static void main(String[] args) {
// 索尼单反相机
Camera camera = new SlrCameras(new Sony());
camera.showInfo();
// 佳能卡片相机
Camera camera2 = new DigitalCamera(new Canon());
camera2.showInfo();
}
}
运行结果:【索尼】单反相机
【佳能】卡片相机(数字相机)从上述代码中可以看出,我们现在已经可以对不同类型和不同产品的相机进行任意的组合了,例如索尼单反相机,或者佳能单反相机都是可以的,如果想要增加一个品牌或者产品只需要增加具体的实现类就可以了三 桥接模式理论(一) 定义和特点定义:将抽象与实现分离,使它们可以独立变化实现的意思并不是指抽象的派生类,而是指通过组合来代替继承关系,从而降低抽象和具体实现产品两个可变换维度之间的耦合,就像我们的相机品牌和相机产品类型之间的分离(二) 结构简单说明一下其中的角色实现化角色(Implementor):定义实现化角色的接口,供扩展抽象化角色使用例如抽象出相机的品牌,可以扩展出例如佳能索尼等各种品牌具体实现化角色(ConcreteImplementor):实现化角色的具体实现例如各种品牌抽象化(Abstraction)角色:定义一个抽象类,其中引用了实现化角色(想要组合)例如相机产品扩展抽象化(RefinedAbstraction)角色:抽象化角色子类,实现父类方法,且通过组合关系调用实现化角色中的业务方法例如具体相机产品,单反相机,卡片相机等等( 三) 优点和缺点优点:经常遇到一些可以通过两个或多个维度划分的事物,第一种解决方式就是多层继承,但是复用性比较差,同时类的个数也会很多,桥接模式是改进其的更好办法桥接模式增强了系统的扩展性,在两个维度中扩展任意一个维度都不需要修改原有代码,符合开闭原则缺点:桥接模式增加了系统的理解与设计难度:因为聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度(四) 使用场景一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合一个类存在两个独立变化的维度,且这两个维度都需要进行扩展虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统好文要顶 关注我 收藏该文 BWH_Steven
关注 - 1
粉丝 - 44 +加关注 0 0
« 上一篇: 【设计模式】第六篇:来康康适配器模式 posted @ 2020-11-23 10:46 BWH_Steven 阅读(11) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
发表评论 【福利】注册AWS账号,立享12个月免费套餐 编辑预览 7693b08a-a8f6-49f3-f45a-08d88556cc23 Markdown 帮助自动补全 不改了退出 订阅评论 [Ctrl+Enter快捷键提交]
首页 新闻 博问 专区 闪存 班级 【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】博客园 & 陌上花开HIMMR 给单身的程序员小哥哥助力脱单啦~
【推荐】从零开始的RPG游戏制作教程,来《魔兽争霸III》共同成长
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动
【福利】AWS携手博客园为开发者送免费套餐与抵扣券
【推荐】 阿里云折扣价格返场,错过再等一年
相关博文:
· ArrayList实现原理(JDK1.8)
· 十分钟掌握Pandas(上)——来自官网API
· Java并发之synchronized关键字和Lock接口
· Aso.NetCore的配置系统Configuration
· kalilinux修改更新源和更新命令
» 更多推荐…最新 IT 新闻:
· 当你按下「随机播放」时,QQ音乐和网易云们都做了什么?
· 「菜鸟」索尼挑战大疆,无人机行业来了新玩家
· 谷歌整合所有音乐服务,YouTube能否扛起大旗?
· vivo为什么要重新做一个手机系统?
· 超大 AirPods、9 倍大纸牌、手机投影仪……这些产品不好用但很吸睛
» 更多新闻…
公告 昵称: BWH_Steven
园龄: 1年6个月
粉丝: 44
关注: 1 +加关注
< 2020年11月> 日一二三四五六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 7 8 9 10 11 12
搜索 常用链接 我的随笔我的评论我的参与最新评论我的标签 随笔档案 2020年11月(7) 2020年10月(5) 2020年9月(4) 2020年8月(1) 2020年7月(2) 2020年6月(4) 2020年5月(11) 2020年4月(9) 2020年3月(3) 2020年2月(8) 2020年1月(2) 2019年11月(3) 2019年10月(6) 2019年9月(5) 2019年8月(9) 2019年7月(9) 2019年6月(24) 最新评论1. Re:(九) SpringBoot起飞之路-整合/集成Swagger 2 And 3赞!!!–刘之西东2. Re:MyBatis 进阶,MyBatis-Plus!(基于 Springboot 演示)大有收获,感谢–HuiSky3. Re:一个后端开发的 Vue 笔记【入门级】@夕阳寸草畔 vue 不是双向绑定,v-model 只是语法糖,和后端的WPF完全不一样的绑定机制。 vue 为什么不是双向绑定? 另外WPF一般认为是“前端"…–James-yu4. Re:一个后端开发的 Vue 笔记【入门级】@GZ^ 大佬太多,我也是刚看这个,还是谦虚学习的好哈哈…–BWH_Steven5. Re:一个后端开发的 Vue 笔记【入门级】@夕阳寸草畔 好的,我针对这块看一下,再了解一下哈…–BWH_Steven阅读排行榜 1. 什么是面向对象?(通俗易懂)(43049) 2. 判断List集合为空还是null的正确打开方式(7135) 3. 什么是Java内部类?(2922) 4. Java开发环境不再需要配置classpath!(2893) 5. 一篇搞定Java过滤器(2836) 评论排行榜 1. 一个后端开发的 Vue 笔记【入门级】(9) 2. 如何用C++实现栈(2) 3. (九) SpringBoot起飞之路-整合/集成Swagger 2 And 3(1) 4. MyBatis 进阶,MyBatis-Plus!(基于 Springboot 演示)(1) 5. 微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)(1) 推荐排行榜 1. 一个后端开发的 Vue 笔记【入门级】(9) 2. 教会舍友玩 Git (再也不用担心他的学习)(6) 3. 微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)(5) 4. 深入分析——HashSet是否真的无序?(JDK8)(3) 5. MyBatis 进阶,MyBatis-Plus!(基于 Springboot 演示)(2)
Copyright © 2020 BWH_Steven
Powered by .NET 5.0.0 on Kubernetes