适配模式桥接模式代理模式区别(设计模式七)
适配模式桥接模式代理模式区别(设计模式七)
2024-07-01 05:18:18  作者:遗我双鲤鱼  网址:https://m.xinb2b.cn/sport/vnw174188.html

大家好,欢迎来到编程队伍,我是作者王小伍,你可以叫我伍先生

这篇文章是设计模式系列文章的第七篇:桥接模式

设计模式系列前几篇没看的可以点击对应的文章快速查看

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

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

设计模式(三):生成器模式

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

设计模式(五):适配器模式

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

正文

我们还是老规矩,用一个具体案例开始我们的设计模式之旅

一般去景区游玩,买门票时针对儿童、老人、军人、医护人员或其他特定人群会有一定的优惠:比如儿童6折,老人5折

假如有A、B两个景区,A景区门票原价100,B景区门票原价150。那么,这两个景区的儿童票和老人票如下

A景区儿童票 A景区老人票 B景区儿童票 B景区老人票 100 * 0.6 = 60 100 * 0.5 = 50 150 * 0.6 = 90 150 * 0.5 = 75

我们用代码来实现一下,代码结构应该是这样的

适配模式桥接模式代理模式区别(设计模式七)(1)

代码写完了,但是还不够完美。我们需要考虑代码的扩展性

假如后续有针对军人、医护人员的优惠该怎么扩展?你可能会说再增加对应的类不就行了

确实可以,但是如果是又增加了C景区、D景区呢,这时候增加的就不只是一两个类了

适配模式桥接模式代理模式区别(设计模式七)(2)

需要增加的类是几何倍的增长,最终我们的类会变得非常多。而且每次新增时不只是一个类,而是N个类

比如,新增景区时,有几种优惠人群就需要新增几个类。反之也一样,需要新增优惠人群时,有几个景区就需要新增几个类

要解决这个问题,就需要使用到桥接模式

我们可以把代码进行抽象,使景区和优惠政策相互独立不耦合,就像是这样

适配模式桥接模式代理模式区别(设计模式七)(3)

如图右上角,新建一个 People 接口类,儿童类和老人类都实现这个接口,可以在 getSale() 方法中返回对应的折扣

A 和 B 两个景区类,各自把 People类作为成员变量引入进来,此时 people就是一个桥梁。A 景区和 B 景区可以调用 people.getSale()来计算对应人群的门票价格

这样改完以后,无论是新增景区还是新增优惠人群,都只需要新增一个类即可

用 java 代码来实现一下:

People接口类

public interface People { String getSale();}

儿童类

public class Children implements People { @Override public String getSale() { return "0.6"; //儿童票6折 }}

老人类

public class OlderPeople implements People { @Override public String getSale() { return "0.5"; // 老人票5折 }}

门票接口类

public interface Tickets { int getMoney();}

A景区门票类

public class ATickets implements Tickets{ private People people; public ATickets(People people) { this.people = people; } @Override public int getMoney() { String sale = people.getSale(); // 获得折扣 BigDecimal saleBigDecimal = new BigDecimal(sale); // java小数计算会丢失精度,要用BigDecimal来计算 BigDecimal ticketsBigDecimal = new BigDecimal("100"); // a景区门票原价100 return ticketsBigDecimal.multiply(saleBigDecimal).intValue(); // 原价门票乘以折扣 }}

B景区门票类

public class BTickets implements Tickets{ private People people; public BTickets(People people) { this.people = people; } @Override public int getMoney() { String sale = people.getSale(); // 获得折扣 BigDecimal saleBigDecimal = new BigDecimal(sale); // java小数计算会丢失精度,要用BigDecimal来计算 BigDecimal ticketsBigDecimal = new BigDecimal("150"); // b景区门票原价100 return ticketsBigDecimal.multiply(saleBigDecimal).intValue(); // 原价门票乘以折扣 }}

模拟调用

public static void main(String[] args) { People children = new Children(); People olderPeople = new OlderPeople(); Tickets aTickets = new ATickets(children); System.out.println("A景区儿童票=" aTickets.getMoney()); aTickets = new ATickets(olderPeople); System.out.println("A景区老人票=" aTickets.getMoney()); Tickets bTikcets = new BTickets(children); System.out.println("B景区儿童票=" bTikcets.getMoney()); bTikcets = new BTickets(olderPeople); System.out.println("B景区老人票=" bTikcets.getMoney()); }

模拟调用最后输出结果如下

A景区儿童票=60

A景区老人票=50

B景区儿童票=90

B景区老人票=75

基本介绍

桥接模式是比较常用的设计模式之一,在创建型模式、结构型模式和行为型模式分类中,桥接模式归属于结构型模式

桥接模式可以将一个大类或者一系列紧密相关的类拆分成 控制层实现层 两个相互独立的层次结构,从而能在开发时分别使用

在上文的具体案例中,Tickets 属于控制层,People 属于实现层

适配模式桥接模式代理模式区别(设计模式七)(4)

控制层调用实现层的业务逻辑并与自身的业务逻辑进行组合,形成复杂的逻辑控制对外输出,客户端调用控制层来完成自己的业务

优缺点优点

桥接模式最大的优点在于将一个具有多重功能的系统进行解耦,拆分成相互独立的层次,从而提高系统的可扩展性

桥接模式符合开闭原则,不管新增控制层或实现层的代码都可以很容易实现,而且它们不会相互影响

也符合单一原则,控制层专注于控制层的逻辑处理,实现层专注于实现层的逻辑处理

业务系统在调用时只与控制层交互,不用关心实现层的具体逻辑

缺点

桥接模式的主要缺点是增加了系统的设计与理解难度,并且,想要从一个多重功能中识别到相互独立的层次结构也不是一件容易的事情

适用场景

桥接模式的主要特点是将一个具有多重功能的系统拆分成两个相互独立的层次结构。所以,在识别到一个类具有两个相互独立变化的维度时,可以优先考虑使用该模式

桥接模式也常用于解决由于继承造成的代码侵入问题,在不希望或者不适用于继承的场景下也可以考虑使用该模式

如果想拆分一个复杂庞大的类时,也可以考虑使用该模式,前提是这个类可以拆分成多个相互独立的层次结构

桥接模式在处理跨平台应用、 支持多种类型的数据库服务器或与多个特定种类 (例如云平台和社交网络等) 的 API 供应商协作时会特别有用

与其他模式关系与适配器模式对比

桥接模式常用于系统设计初期,使我们能够将程序的各个部分相互独立,以便于开发

适配器模式常用在已有的程序中,当发现已有的类无法协同工作时可以考虑适配器模式

搭配抽象工厂模式使用

如果由桥接模式定义的控制层只能与特定实现层合作, 在业务系统调用时就会很复杂

可以使用抽象工厂模式 桥接模式,对业务系统隐藏其复杂的实现过程

工厂模式回顾:设计模式(二):工厂模式

搭配生成器模式使用

生成器模式中的导演类负责桥接模式中的控制层工作,各种不同类型的生成器负责桥接模式中的实现层工作

生成器模式回顾:设计模式(三):生成器模式

设计模式不是万能的,只有合理利用设计模式才能写出合理的代码

  • 腊梅花诗歌(芳菊诗歌爱)
  • 2024-07-01芳菊诗歌爱题记:爱是亘古长明的灯塔,它定睛望着风暴却兀不为动,爱就是充实了的生命,正如盛满了酒的酒杯——泰戈尔《爱》(投稿)作者:芳菊原本以为经历了世间无数雨雪冰霜磨难坎坷汹涌的泪泉早已干涸今天2022年1月4。
  • 宿舍充电宝被盗(情侣突然在出租屋衣柜翻出一个充电宝)
  • 2024-07-01情侣突然在出租屋衣柜翻出一个充电宝情侣租房却意外发现家中出现摄像头?近日,上海的张先生和女友遇到的这件烦心事,引发网友关注事发:情侣合租房意外发现针孔摄像头11月1日,上海市民张先生和女友在微博上反映,其在半年前在上海宝山区一小区与人。
  • 318川藏线的危险(318川藏线到底丧命多少人)
  • 2024-07-01318川藏线到底丧命多少人川藏线,以雄奇险峻的风光和复杂莫测的路况闻名于世每年,有不少游客以不同的形式表达对藏区的喜爱和朝拜或是自驾游,或是骑行,亦或是徒步搭车但是,我们总能不时看见川藏线旅游时的交通事故川藏线上究竟死了多少人。
  • 楚乔传宇文玥说出真相(楚乔恢复记忆宇文席领盒饭)
  • 2024-07-01楚乔恢复记忆宇文席领盒饭楚乔恢复记忆宇文席领盒饭,楚乔传预告星儿赵丽颖和宇文玥林更新居然拔刀相向!师徒情分从此恩断义绝,剧情开虐啦!宇文玥:你在干什么?星儿:你看不出来吗?宇文玥:原来这才是你的真面目星儿:别再叫我星儿了,我。
  • 梦见金耳环(梦见金耳环什么意思)
  • 2024-07-01梦见金耳环什么意思梦见金耳环,吉兆,预示着婚姻幸福、美满男人梦到金耳环,家庭消费巨增少女梦到金耳环,会嫁给有钱的人家男人梦见自己戴金耳环,妻子不久会怀孕已婚女子梦见戴金耳环,会生一个漂亮的男孩梦见金耳环意味着,不知怎麽。
  • 郭麒麟电视剧赘婿第18集 电视剧赘婿官宣开播
  • 2024-07-01郭麒麟电视剧赘婿第18集 电视剧赘婿官宣开播郭麒麟和宋轶,分别在各自的微博上发布了大红“喜帖”,宣告“婚讯”电视剧《赘婿》官宣开播了以前看过德云社少班主郭麒麟相声节目,想想应该还是挺好玩的,于是去看了,结果一看就停不下来,一下午看了九集,一边看。
  • 梦华录结局赵盼儿的真实身份(一心搞钱远离渣男)
  • 2024-07-01一心搞钱远离渣男近期热播的电视剧《梦华录》,画面唯美,演员养眼,内容情节更是看得大家直呼过瘾,太上头了!整个剧作的服饰化妆道具都堪称精良,与宋朝时期留存的画作、史书文献的记录进行比对,剧组在尊重史实的基础上,更加入了。
  • 怎么让天蝎女越来越爱你(一招吃定天蝎女)
  • 2024-07-01一招吃定天蝎女天蝎女是公认的难追,如果你是玻璃心,又没有什么毅力的人,男人恋爱经劝你还是不要追了,只会白白浪费时间和感情如果你很坚强又有毅力,男人恋爱经教你一招吃定天蝎女,治好她的高冷,暖化她的心,让她对你死心塌地。
  • dnf都有什么套装(DNF史上最强的10大套装)
  • 2024-07-01DNF史上最强的10大套装假猪套天下第一!这段话流传非常迅猛,虽然出自DNF,但是一些跟DNF没有任何关系的游戏也莫名躺枪,该语言也出现在各大媒体平台及游戏直播平台,在短短的时间内迅速成为了网络流行语奥林匹斯神-防具套装201。
  • 色盲会分不清什么颜色(色盲眼中的世界是什么样的)
  • 2024-07-01色盲眼中的世界是什么样的色盲也称为色觉障碍,是指由于视网膜的视锥细胞内感光色素异常或不全,以致缺乏辨别某种或某几种颜色的能力比如不能分辨红色者称为红色盲或第一色盲,在光谱上红色部缩短,绿色看成黄色,紫色看成蓝色;不能分辨绿色。
  • 正确的窗帘安装步骤(窗帘安装的方法及窗帘安装注意事项)
  • 2024-07-01窗帘安装的方法及窗帘安装注意事项  选择合适的窗帘只是成功了一半,窗帘安装时注意细节,窗帘的装饰就会得到最大程度的发挥选择明轨还是暗轨应该在吊挂时进行设计悬挂屋顶和外罩时,会进行配套的窗帘箱的设计此时,请选择明轨正如其名,是木制杆、。