设计模式-桥接模式

背景

手机操作问题

现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网,打电话等),如图:

传统方案解决手机使用问题(类图):

传统方案解决手机操作问题分析

  1. 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。
  2. 违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本.
  3. 解决方案使用桥接模式

基本介绍

  1. 桥接模式(Bridge模式)是指:将实现抽象 放在两个不同的类层次 中,使两个层次可以独立改变
  2. 是一种结构型设计模式
  3. Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展

桥接模式原理类图

类图说明
  1. Client类:桥接模式的调用者
  2. 抽象类(Abstraction) :维护了Implementor/ 即它的实现类ConcreteImplemnto.rA..二者是聚合关系,Abstraction充当桥接类
  3. RefinedAbstraction:是Abstraction 抽象类的子类
  4. Implementor:行为实现类的接口
  5. ConcreteImplementorA/B :行为的具体实现类
  6. 从UML图:这里的抽象类和接口是聚合的关系,其实调用和被调用关系

桥接模式解决手机操作问题

使用桥接模式改进传统方式,让程序具有搞好的扩展性,利用程序维护

  1. 应用实例说明(和前面要求一样)
  2. 使用桥接模式的类图
  1. 代码示例

Brand.class:

复制代码
// 接口
public interface Brand {
    
    void open();
    void close();
    void call();
    
}

Vivo.class:

复制代码
public class Vivo implements Brand{
    @Override
    public void open() {
        System.out.println(" Vivo手机开机");
    }

    @Override
    public void close() {
        System.out.println(" Vivo手机关机");
    }

    @Override
    public void call() {
        System.out.println(" Vivo手机打电话");
    }
}

XiaoMi.class:

复制代码
public class XiaoMi implements Brand{
    @Override
    public void open() {
        System.out.println(" 小米手机开机");
    }

    @Override
    public void close() {
        System.out.println(" 小米手机关机");
    }

    @Override
    public void call() {
        System.out.println(" 小米手机打电话");
    }
}

Phone.class:

复制代码
public abstract class Phone {
    
    // 组合品牌
    private Brand brand;
    
    // 构造器
    public Phone(Brand brand){
        this.brand = brand;
    }
    
    protected void open(){
        this.brand.open();
    }

    protected void close(){
        this.brand.close();
    }

    protected void call(){
        this.brand.call();
    }
    
    
    
}

FoldedPhone.class:

复制代码
// 折叠式手机类,继承 抽象类 Phone
public class FoldedPhone extends Phone{
    public FoldedPhone(Brand brand) {
        super(brand);
    }
    
    public void open() {
        super.open();
        System.out.println("折叠样式手机");
    }
    
    public void close(){
        super.close();
        System.out.println(" 折叠样式手机");
    }

    public void call(){
        super.call();
        System.out.println(" 折叠样式手机");
    }
}

UpRightPhone.class:

复制代码
public class UpRightPhone extends Phone{
    public UpRightPhone(Brand brand) {
        super(brand);
    }

    public void open() {
        super.open();
        System.out.println("直立样式手机");
    }

    public void close(){
        super.close();
        System.out.println(" 直立样式手机");
    }

    public void call(){
        super.call();
        System.out.println(" 直立样式手机");
    }
}

桥接模式在JDBC的源码分析

Jdbc的Driver 接口,如果从桥接模式来看,Driver 就是一-个接口,下面可以有MySQL的Driver, Oracle 的Driver,这些就可以当做实现接口类

对 jdbc 源码分析的类图

桥接模式的注意事项和细节

  1. 实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。
  2. 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。
  3. 桥接模式替代多层继承方案 ,可以减少子类的个数降低系统的管理和维护成本
  4. 桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程,
  5. 桥接模式要求正确识别出系统中两个独立变化的维度(抽象和实现) ,因此其使用范围有一定的局限性,即需要有这样的应用场景。
相关推荐
四谎真好看11 分钟前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程17 分钟前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t17 分钟前
ZIP工具类
java·zip
lang201509281 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
pengzhuofan2 小时前
第10章 Maven
java·maven
百锦再2 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说2 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多2 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring
百锦再2 小时前
对前后端分离与前后端不分离(通常指服务端渲染)的架构进行全方位的对比分析
java·开发语言·python·架构·eclipse·php·maven
DokiDoki之父3 小时前
Spring—注解开发
java·后端·spring