Java GoF 23种设计模式-结构型模式-桥接模式(Bridge Pattern)

文章目录

  • 一、模式定义
  • 二、模式动机
  • 三、模式结构
  • 四、代码实现
  • 五、桥接和装饰、适配器模式的不同

一、模式定义

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

二、模式动机

  • 在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
  • 当多个对象存在多种变化的因素时,考虑将这部分变化的部分抽象出来再聚合进来;比如不同品牌的手机使用不同的语言运行环境、使用不同的软件等。

三、模式结构

Java GoF 23种设计模式-结构型模式-桥接模式(Bridge Pattern)_第1张图片

桥接模式包含如下角色:

  • Abstraction:抽象类,用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以维护该对象,它与Implementor之间具有关联关系,它既可以包含抽象业务方法,也可以包含自己的具体业务方法。
  • RefinedAbstraction:扩充抽象类,扩充由Abstraction定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在Abstraction中声明的抽象业务方法,在RefinedAbstraction中可以调用在Implementor中定义的业务方法。
  • Implementor:实现类接口,定义实现类的接口,这个接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同,一般而言,Implementor接口仅提供基本操作,而Abstraction定义的接口可能会做更多更复杂的操作。Implementor接口对这些基本操作进行了声明,而具体实现交给其子类。通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调用到Implementor中定义的方法,使用关联关系来替代继承关系。
  • ConcreteImplementor:具体实现类,具体实现Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同实现,在程序运行时,ConcreteImplementor对象将替换其父类对象,提供给抽象类具体的业务操作方法。

四、代码实现

生活中,手机有着不同的品牌,每个品牌的手机样式以及内部细节都是不一样的,每个手机有着对应支持运行的软件语言,例如安卓、IOS;而一个软件需要安装在这个手机上,则必须使用该种类语言作为实现。例如QQ,通常要编写不同的语言实现来满足在不同环境的运行。
那么这里一个手机就有着两个变化的维度,一个是品牌,一个是软件语言。

角色
Abstraction:抽象类 HandsetBrand.java
RefinedAbstraction:扩充抽象类 HandsetBrandHuaWei.java、HandsetBrandIphone.java、HandsetBrandLenovo.java
Implementor:实现类接口 Soft.java
ConcreteImplementor:具体实现类 AndroidSoft.java、IOSSoft.java

HandsetBrand.java

package com.design.demo.structure.bridge;

/**
 * 抽象类:手机品牌
 *
 * @author administrator
 * @date 2020-05-20 20:31
 */
public abstract class HandsetBrand {

    protected Soft soft;

    public HandsetBrand(Soft soft) {
        this.soft = soft;
    }

    //运行
    public abstract void run();

}

HandsetBrandHuaWei.java

package com.design.demo.structure.bridge;

/**
 * 抽象类具体实现
 * 手机品牌:华为手机
 *
 * @author administrator
 * @date 2020-05-20 1:58
 */
public class HandsetBrandHuaWei extends HandsetBrand {

    public HandsetBrandHuaWei(Soft soft) {
        super(soft);
    }

    @Override
    public void run() {
        System.out.println("我是华为手机,运行软件:" + super.soft.qqSoft());
    }
}

HandsetBrandIphone.java

package com.design.demo.structure.bridge;

/**
 * 抽象类具体实现
 * 手机品牌:苹果手机
 *
 * @author administrator
 * @date 2020-05-20 1:58
 */
public class HandsetBrandIphone extends HandsetBrand {

    public HandsetBrandIphone(Soft soft) {
        super(soft);
    }

    @Override
    public void run() {
        System.out.println("我是苹果手机,运行软件:" + super.soft.qqSoft());
    }
}

HandsetBrandLenovo.java

package com.design.demo.structure.bridge;


/**
 * 抽象类具体实现
 * 手机品牌:联想手机
 *
 * @author administrator
 * @date 2020-05-20 1:58
 */
public class HandsetBrandLenovo extends HandsetBrand {

    public HandsetBrandLenovo(Soft soft) {
        super(soft);
    }

    @Override
    public void run() {
        System.out.println("我是联想手机,运行软件:" + super.soft.qqSoft());
    }
}

Soft.java

package com.design.demo.structure.bridge;

/**
 * 抽象类:软件
 *
 * @author administrator
 * @date 2020-05-20 20:27
 */
public interface Soft {

    public String qqSoft();

}

AndroidSoft.java

package com.design.demo.structure.bridge;

/**
 * 抽象类实现,Android语言
 *
 * @author administrator
 * @date 2020-05-20 20:28
 */
public class AndroidSoft implements Soft {

    @Override
    public String qqSoft() {
        return "一个基于Android语音的QQ实现...";
    }

}

IOSSoft.java

package com.design.demo.structure.bridge;

/**
 * 抽象类实现,IOS语言
 *
 * @author administrator
 * @date 2020-05-20 20:28
 */
public class IOSSoft implements Soft {

    @Override
    public String qqSoft() {
        return "一个基于IOS语音的QQ实现...";
    }

}

Client.java

package com.design.demo.structure.bridge;

/**
 * 测试类
 *
 * @author administrator
 * @date 2020-05-20 20:37
 */
public class Client {

    public static void main(String[] args) {
        //有一些QQ软件的不同语言实现
        Soft IOSQQSoft = new IOSSoft();
        Soft AndroidQQSoft = new AndroidSoft();

        //有一些不同品牌的手机,并且和软件实现关联起来
        HandsetBrand lenovo = new HandsetBrandLenovo(AndroidQQSoft);
        HandsetBrand huaWei = new HandsetBrandHuaWei(AndroidQQSoft);
        HandsetBrand iphone = new HandsetBrandIphone(IOSQQSoft);

        //让他们运行下QQ程序看看
        lenovo.run();
        huaWei.run();
        iphone.run();
    }

}

测试类运行结果
Java GoF 23种设计模式-结构型模式-桥接模式(Bridge Pattern)_第2张图片

五、桥接和装饰、适配器模式的不同

  • 装饰者模式:主要是为了不改变原类的情况下,对原类进行增强
  • 适配器模式:主要是为了简化客户类调用,使得客户类能够按自己期望的方式调用目标类(目标类通常无法直接修改成客户类期望的样子)
  • 桥接模式:主要是将一个有着多个维度的类进行拆分,以降低复杂度,以满足各维度能够独立扩展和维护,然后通过聚合的方式使用这些维度的功能。

你可能感兴趣的:(设计模式,设计模式,java)