桥接模式
1.桥接模式
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。
这个概念听着那是相当拗口了,其实通过例子解释后,就能很好的理解了。
2.代码示例
下面先看一个例子,这个例子表现了手机与手机软件之间的关系
2.1HandsetSoft类
这个类是手机软件的抽象类
public abstract class HandsetSoft {
public abstract void run();
}
2.2HandSetGame类
这个是手机软件的具体实现类,游戏软件类
public class HandSetGame extends HandsetSoft{
@Override
public void run() {
System.out.println("运行手机游戏");
}
}
2.3WeChat类
这个是手机软件的具体实现类,微信软件类
public class WeChat extends HandsetSoft{
@Override
public void run() {
System.out.println("运行手机微信");
}
}
2.4HandsetBrand类
这个是手机品牌的抽象类,它里面有一个游戏软件的属性,这样不同的手机品牌就都可以使用软件了
public abstract class HandsetBrand {
protected HandsetSoft soft;
public void setSoft(HandsetSoft soft) {
this.soft = soft;
}
public abstract void run();
}
2.5MIPhone类
这个是手机品牌的具体实现类,小米手机类
public class MIPhone extends HandsetBrand{
@Override
public void run() {
System.out.print("小米手机" );
soft.run();
}
}
2.6IPhone类
这个是手机品牌的具体实现类,iphone类
public class IPhone extends HandsetBrand{
@Override
public void run() {
System.out.print("苹果手机");
soft.run();
}
}
2.7测试类
public class MainApp {
public static void main(String[] args) {
HandsetBrand miPhone = new MIPhone();
miPhone.setSoft(new HandSetGame());
miPhone.run();
miPhone.setSoft(new WeChat());
miPhone.run();
HandsetBrand iphone = new IPhone();
iphone.setSoft(new WeChat());
iphone.run();
}
}
运行结果
小米手机运行手机游戏
小米手机运行手机微信
苹果手机运行手机微信
以上就是桥接模式的代码示例了,可以看到,我们这边给了两个抽象类,及两个抽象类各自的子类实现。在测试方法中,实例化手机品牌的对象,并将手机软件的具体子类,传入手机品牌的setSoft方法,目的是给手机安装软件,当调用手机品牌的run方法后,即可表示某个品牌运行某个手机软件了。
3.桥接模式UML类图
看到这里,可能还是有人好奇,这个桥接模式到底是啥,懵懵的,别着急,下面来看一下桥接模式的UML类图
桥接模式,这个设计模式的名称中的这个桥,其实就是示例代码中两个有聚合关系的父类的这根聚合关系连接线,这跟线就像一座桥一样,连接两个抽象父类。
4.合成/聚合原则
在可能上面讲清楚了桥接模式中这个桥的含义,但是大家对桥接模式这个设计模式本身的功能还是有点模糊。这边先给大家介绍一个原则,叫合成/聚合原则。
合成/聚合原则,里面有两个意思,合成和聚合
- 合成:是一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。例如:鸡有两条腿,两个翅膀,一双眼睛等等,那么腿、翅膀、眼睛和鸡就是合成的关系,一个强拥有的关系,腿、翅膀、眼睛等,合成在一起,组成了鸡,和鸡有一样的生命周期,一旦鸡死了,那么翅膀、腿、眼睛等都可能独自生存,这就是合成关系。
- 聚合:是一种弱拥有关系,体现的是A对象可以包含B对象,但是B对象不是A对象的一部分。例如一群大雁,每只大雁属于一个大雁群,一个大雁群可以拥有多只大雁,大雁群中的某只大雁可以脱离雁群独自生活。这就是聚合关系,A对象拥有B对象,但是B对象也可以独自存在。
这个原则和桥接模式有什么关系呢?其实桥接模式就很好的体现了这个原则中的聚合原则。
示例代码中,手机品牌的抽象类HandsetBrand抽象类中,包含HandsetSoft类对象,这样手机品牌的子类就可以从父类继承该HandsetSoft对象,这样的话,不同品牌的手机就可以自由安装不同的软件,而软件又可以独立于手机品牌独自存在。这样就将手机品牌和手机软件的耦合度降低了,当遇到新增新的软件或者新增新的手机品牌需求后,只需要新增手机品牌的子类或手机软件的子类,并在客户端调用一下,完全不会更改原有代码,即可实现新的需求。
这样的设计,也更加符合开放-封闭原则,对扩展开放,对修改关闭。
5.总结
为什么会出现桥接模式呢?因为在前面的学习中,我们一开始想到的扩展程序的方法一般都是使用类继承,但是当某个对象的组成维度比较复杂的时候,使用类继承,就会带来很多麻烦,比如侵入原有代码,类扩展不方便等。
这个时候,就要考虑放弃使用类继承,而改用合成/聚合,这样复杂的对象可以被简单化,将各自核心的组成部分相互独立开来,让它们各自变化,这样每种实现变化就都不会影响到其他的实现了,从而能够应对更多的变化。文章来源:https://www.toymoban.com/news/detail-603326.html
某个对象的组成维度比较复杂的时候,使用类继承,就会带来很多麻烦,比如侵入原有代码,类扩展不方便等。
这个时候,就要考虑放弃使用类继承,而改用合成/聚合,这样复杂的对象可以被简单化,将各自核心的组成部分相互独立开来,让它们各自变化,这样每种实现变化就都不会影响到其他的实现了,从而能够应对更多的变化。
当我们实现一个系统模块的时候,如果这个模块可能有多个角度的分类,每一种分类都有可能变化,那么就把这多种角度分离出来让它们独立变化,减少它们之间的耦合。文章来源地址https://www.toymoban.com/news/detail-603326.html
到了这里,关于Java设计模式-桥接模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!