博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
桥接模式
阅读量:6691 次
发布时间:2019-06-25

本文共 1871 字,大约阅读时间需要 6 分钟。

  在明白桥接模式之前需要先弄懂一个概念,聚合/组合原则。聚合和组合都是一种拥有关系,唯一不同的是,聚合中的主对象和附属对象可以独立存在,所以生命周期互不影响,而组合关系是依赖共生的,他们有共同的生命周期,一旦主对象不存在,附属对象也就没有了。举例:树和树叶是组合关系,一旦树枯死了,树叶也就不能存活了;车和车轮是聚合关系,车轮就算没有安装在汽车上一样可以存在。

  桥接模式正是运用了聚合/组合原则来满足设计的需求,以达到抽象部分和它的实现部分分离,让他们都有自己的实现,从而达到松耦合的目的

  以一个例子说明桥接模式。比如这里存在一种手机模型,现在有很多种品牌和软件存在,现在要想在某种品牌手机上运行游戏或者音乐软件,如果用传统的继承方法来做,大概是这种模型:

                               

  这种模型确实可用,但是不利于扩展,如果现在要加入"小米手机"品牌或者加入一个新的手机功能模块,那么还要继续添加小米手机的品牌和相应的软件和游戏类。而新添加的功能和以前的代码功能差不多,这样做就没有达到代码复用的目的。因为这种继承关系,子类严重依赖父类,如果在现在手机加入新功能了,那么还必须修改父类才能达到添加功能的目的。

  如果使用桥接模式设计的话,类图则会是以下的样子:

 

                                

 

相应的的代码如下:

手机品牌具体实现类和手机抽象类:

1 public abstract class Phone { 2  3     public Soft soft; 4      5     public void setSoft(Soft soft){ 6         this.soft = soft; 7     } 8      9     public abstract void run();10 }
1 public class Nokia extends Phone {2     @Override3     public void run() {4         soft.run();5     }6 }
1 public class WinPhone extends Phone {2     @Override3     public void run() {4         soft.run();5     }6 }

 

手机软件抽象类和具体软件实现类:

1 public abstract class Soft {2     public abstract void run();3 }
1 public class Game extends Soft {2     @Override3     public void run() {4         System.out.println("ganme run……");5     }6 }
1 public class Music extends Soft {2     @Override3     public void run() {4         System.out.println("music run……");5     }6 }

测试类如下:

1 public class Test { 2     public static void main(String[] args) { 3         Phone nokia = new Nokia(); 4         nokia.setSoft(new Game()); 5         nokia.run(); 6          7         nokia.setSoft(new Music()); 8         nokia.run(); 9         10         Phone winphone = new WinPhone();11         winphone.setSoft(new Game());12         winphone.run();13         14         winphone.setSoft(new Music());15         winphone.run();16     }17 }

运行结果:

 

总结:桥接模式很大程度上解决了继承带来的代码不能复用和冗余问题,而且利于扩展,遵守了开闭原则。

转载于:https://www.cnblogs.com/bigbang92/p/bridge-pattern.html

你可能感兴趣的文章
DNS服务器维护命令
查看>>
六、用户与权限
查看>>
面向机器学习数据平台的设计与搭建
查看>>
centos6.7 编译安装mysql-5.6.27
查看>>
spring cloud 整合zpkin问题
查看>>
Maven下载慢的解决方案
查看>>
我的友情链接
查看>>
Android 核心分析 之七------Service深入分析
查看>>
Regsvr32使用方法
查看>>
柱形图Demo
查看>>
编辑器
查看>>
关闭windows的默认共享
查看>>
react开发环境搭建
查看>>
数据库读写分离
查看>>
社交是微信营销
查看>>
2008 R2 证书服务器应用详解
查看>>
hive 动态分区太多问题
查看>>
Windows Server 2008 RemoteApp(二)---部署激活远程桌面授权服务器
查看>>
读取日志文件开发总结
查看>>
IOS --React Native
查看>>