设计模式11 - 桥梁模式【Bridge Pattern】

简介: 设计模式11 - 桥梁模式【Bridge Pattern】


举例:(智能手机使用安装包的例子)

—未优化的例子—

/**
  * 智能手机抽象类
  */
 public abstract class SmartPhone {
     public abstract void installApk();
     public abstract void openApk();
     public void useApk() {
         installApk();
         openApk();
     }
 }
 /**
  * 专门使用微信手机
  */
 public class WechatPhone extends SmartPhone {
     @Override
     public void installApk() {
         System.out.println("安装微信");
     }
     @Override
     public void openApk() {
         System.out.println("打开微信");
     }
     @Override
     public void useApk() {
         super.useApk();
         System.out.println("开始使用微信");
     }
 }
 /**
  * 专门使用QQ手机
  */
 public class QQPhone extends SmartPhone {
     @Override
     public void installApk() {
          System.out.println("安装QQ");
     }
     @Override
     public void openApk() {
          System.out.println("打开QQ");
     }
     @Override
     public void useApk() {
          super.useApk();
           System.out.println("使用QQ");
      }
 }
 //TODO 之后每安装一种apk都要使用不同的手机......

引出问题:我们会发现,每安装一种APK都是用一个手机,这是不合理的,应该一种手机可以安装不同的APK

细心点,会发现 “apk” 和 “手机” 是两个不同的维度。而且抽象和实现写在了一起(即SmartPhone类里面的两个抽象方法和一个具体实现方法),这是十分不合理的。

—优化之后—

/**
 * 抽象APK
 */
public abstract class APK {
    public abstract void beInstalled();
    public abstract void beOpened();
}
public class WeChat extends APK {
    @Override
    public void beInstalled() {
        System.out.println("微信被安装");
    }
    @Override
    public void beOpened() {
        System.out.println("微信被打开");
    }
}
public class QQ extends APK {
    @Override
    public void beInstalled() {
        System.out.println("QQ被安装");
    }
    @Override
    public void beOpened() {
        System.out.println("QQ被打开");
    }
}
/**
 * 抽象智能手机
 */
public abstract class SmartPhone {
    private APK apk;
    public SmartPhone(APK apk) {
        this.apk = apk;
    }
    public void useApk() {
        apk.beInstalled();
        apk.beOpened();
    }
}
public class HuaWei extends SmartPhone {
    public HuaWei(APK apk) {
        super(apk);
    }
}
public class User {
    public void useApk() {
        WeChat weChat = new WeChat();
        HuaWei huaWei = new HuaWei(weChat);
        huaWei.useApk();
        QQ qq = new QQ();
        huaWei = new HuaWei(qq);
        huaWei.useApk();
    }
}

修改之后,可知道手机和APK两个维度已经拆开了。还有抽象与实现也拆开了。下面看看优化之后的好处。

比如说像增加多一个APK,如钉钉

/**
* 抽象APK
*/
public abstract class APK {
   public abstract void beInstalled();
   public abstract void beOpened();
}
public class WeChat extends APK {
   @Override
   public void beInstalled() {
       System.out.println("微信被安装");
   }
   @Override
   public void beOpened() {
       System.out.println("微信被打开");
   }
}
public class QQ extends APK {
   @Override
   public void beInstalled() {
       System.out.println("QQ被安装");
   }
   @Override
   public void beOpened() {
       System.out.println("QQ被打开");
   }
}
> public class DingDing extends APK {
> 
>    @Override    
>    public void beInstalled() {
>        System.out.println("钉钉被安装");   
>    }
> 
>    @Override    
>    public void beOpened() {
>        System.out.println("钉钉被打开");    
>    }
> 
> }
/**
* 抽象智能手机
*/
public abstract class SmartPhone {
   private APK apk;
   public SmartPhone(APK apk) {
       this.apk = apk;
   }
   public void useApk() {
       apk.beInstalled();
       apk.beOpened();
   }
}
public class HuaWei extends SmartPhone {
   public HuaWei(APK apk) {
       super(apk);
   }
}
public class User {
   public void useApk() {
       WeChat weChat = new WeChat();
       HuaWei huaWei = new HuaWei(weChat);
       huaWei.useApk();
       QQ qq = new QQ();
       huaWei = new HuaWei(qq);
       huaWei.useApk();
>      DingDing dingDing = new DingDing();
>      huaWei = new HuaWei(dingDing);
>      huaWei.useApk();
   }
}

会发现,修改的部分,只是代码里面右箭头增加的部分。

手机可能不单只是使用华为的,可能还用小米,所以,代码可以这样优化。

/**
* 抽象APK
*/
public abstract class APK {
   public abstract void beInstalled();
   public abstract void beOpened();
}
public class WeChat extends APK {
   @Override
   public void beInstalled() {
       System.out.println("微信被安装");
   }
   @Override
   public void beOpened() {
       System.out.println("微信被打开");
   }
}
public class QQ extends APK {
   @Override
   public void beInstalled() {
       System.out.println("QQ被安装");
   }
   @Override
   public void beOpened() {
       System.out.println("QQ被打开");
   }
}
/**
* 抽象智能手机
*/
public abstract class SmartPhone {
   private APK apk;
   public SmartPhone(APK apk) {
       this.apk = apk;
   }
   public void useApk() {
       apk.beInstalled();
       apk.beOpened();
   }
}
public class HuaWei extends SmartPhone {
   public HuaWei(APK apk) {
       super(apk);
   }
}
> public class XiaoMi extends SmartPhone {
> 
>    public XiaoMi(APK apk) {
>        super(apk);    
>    } 
> }
public class User {
   public void useApk() {
       WeChat weChat = new WeChat();
       HuaWei huaWei = new HuaWei(weChat);
       huaWei.useApk();
       QQ qq = new QQ();
       huaWei = new HuaWei(qq);
       huaWei.useApk();
>        System.out.println("使用小米手机");
>        XiaoMi xiaoMi = new XiaoMi(weChat);
>        xiaoMi.useApk();
>        xiaoMi = new XiaoMi(qq);
>        xiaoMi.useApk();
   }
}

看,只是增加了代码右键头部分的代码,十分方便。

最后总结:

总结就是第一句的定义呗。其实桥梁模式的优点就是类间解耦,两个角色都可以自己的扩展下去,不会相互影响,这个符合 OCP 原则。

目录
相关文章
|
6月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Bridge(桥接模式)
【设计模式】JAVA Design Patterns——Bridge(桥接模式)
【设计模式】JAVA Design Patterns——Bridge(桥接模式)
|
6月前
|
设计模式 算法 Java
行为型设计模式-策略模式(Strategy Pattern)
行为型设计模式-策略模式(Strategy Pattern)
|
2月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
2月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
6月前
|
设计模式 算法
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
73 1
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
|
6月前
|
设计模式 Java 应用服务中间件
设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
61 1
|
5月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
6月前
|
设计模式 缓存 安全
设计模式 - 创建型模式_ 单例模式 Singleton Pattern
设计模式 - 创建型模式_ 单例模式 Singleton Pattern
78 0
|
6月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
6月前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
51 1