一、桥接模式定义

  • ①:桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使他们都可以独立的变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
  • ②:这里需要理解一下,什么叫抽象与它的实现部分分离。这并不是说,让抽象类与其派生类分离,因为这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象[DPE]。就刚才的例子而言,就是让手机既可以按照品牌来分类,也可以按照功能来分类。
  • ③:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。
  • ④:主要解决,在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
  • ⑤:如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
  • ⑥:对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

按照品牌分类的结构图:
image.png
按照软件分类的结构图:
image.png
由于实现方式有多种,桥接模式的核心意图就是把这些实现独立出来,让它们各自的变化。这就使得每种实现的变化不会影响其他实现,从而达到对应变化的目的:
image.png

二、桥接模式案例

PhoneSoftware.png

创建手机软件抽象类PhoneSoftware

  1. /*手机软件抽象类*/
  2. public abstract class PhoneSoftware {
  3. public abstract void operation();
  4. }

创建PhoneSoftware的具体实现类Call

  1. /*打电话*/
  2. public class Call extends PhoneSoftware{
  3. @Override
  4. public void operation() {
  5. System.out.println("使用手机打电话……");
  6. }
  7. }

创建PhoneSoftware的具体实现类Game

  1. /*玩游戏*/
  2. public class Game extends PhoneSoftware{
  3. @Override
  4. public void operation() {
  5. System.out.println("使用手机玩游戏……");
  6. }
  7. }

创建PhoneSoftware的具体实现类MP3

  1. /*听音乐*/
  2. public class MP3 extends PhoneSoftware{
  3. @Override
  4. public void operation() {
  5. System.out.println("使用手机播放音乐……");
  6. }
  7. }

创建手机品牌抽象类PhoneBrand

  1. /*手机品牌*/
  2. public abstract class PhoneBrand {
  3. private PhoneSoftware phoneSoftware;
  4. public PhoneBrand(PhoneSoftware phoneSoftware) {
  5. this.phoneSoftware = phoneSoftware;
  6. }
  7. public abstract void operation();
  8. public PhoneSoftware getPhoneSoftware() {
  9. return phoneSoftware;
  10. }
  11. public void setPhoneSoftware(PhoneSoftware phoneSoftware) {
  12. this.phoneSoftware = phoneSoftware;
  13. }
  14. }

创建PhoneBrand的具体实现类XiaoMi

  1. /*小米品牌*/
  2. public class XiaoMi extends PhoneBrand{
  3. public XiaoMi(PhoneSoftware phoneSoftware) {
  4. super(phoneSoftware);
  5. }
  6. @Override
  7. public void operation() {
  8. System.out.println("== 正在使用小米品牌手机 ==");
  9. getPhoneSoftware().operation();
  10. }
  11. }

创建PhoneBrand的具体实现类HuaWei

  1. /*华为品牌*/
  2. public class HuaWei extends PhoneBrand {
  3. public HuaWei(PhoneSoftware phoneSoftware) {
  4. super(phoneSoftware);
  5. }
  6. @Override
  7. public void operation() {
  8. System.out.println("== 正在使用华为品牌手机 ==");
  9. getPhoneSoftware().operation();
  10. }
  11. }

客户端调用代码:

  1. public class Client {
  2. public static void main(String[] args) {
  3. PhoneBrand xiaoMi = new XiaoMi(new Call());
  4. xiaoMi.operation();
  5. xiaoMi.setPhoneSoftware(new Game());
  6. xiaoMi.operation();
  7. xiaoMi.setPhoneSoftware(new MP3());
  8. xiaoMi.operation();
  9. System.out.print("\n====================================\n");
  10. PhoneBrand huaWei = new HuaWei(new Call());
  11. huaWei.operation();
  12. huaWei.setPhoneSoftware(new Game());
  13. huaWei.operation();
  14. huaWei.setPhoneSoftware(new MP3());
  15. huaWei.operation();
  16. }
  17. }

输出内容如下:

  1. == 正在使用小米品牌手机 ==
  2. 使用手机打电话……
  3. == 正在使用小米品牌手机 ==
  4. 使用手机玩游戏……
  5. == 正在使用小米品牌手机 ==
  6. 使用手机播放音乐……
  7. ====================================
  8. == 正在使用华为品牌手机 ==
  9. 使用手机打电话……
  10. == 正在使用华为品牌手机 ==
  11. 使用手机玩游戏……
  12. == 正在使用华为品牌手机 ==
  13. 使用手机播放音乐……