23种设计模式之桥接模式

桥接模式

1、定义

桥接模式:将抽象部分与它的实现部分解耦,使得两者都能独立变化

2、桥接模式结构

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

3、示例

Abstraction 创建Person抽象类

java 复制代码
public abstract class Person {

    private Clothing clothing;
    private String type;

    public Clothing getClothing() {
        return clothing;
    }

    public void setClothing(Clothing clothing) {
        this.clothing = clothing;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getType() {
        return this.type;
    }

    public abstract void dress();
}

RefinedAbstraction 创建Man、Lady类

java 复制代码
public class Man extends Person{
    public Man() {
        setType("男人");
    }

    @Override
    public void dress() {
        Clothing clothing = getClothing();
        clothing.personDressCloth(this);
    }
}
java 复制代码
public class Lady extends Person {
    public Lady() {
        setType("女人");
    }

    @Override
    public void dress() {
        Clothing clothing = getClothing();
        clothing.personDressCloth(this);
    }
}

Implementor 创建Clothing抽象类

java 复制代码
public abstract class Clothing {
    public abstract void personDressCloth(Person person);
}

ConcreteImplementor 创建Jacket、Pants类

java 复制代码
public class Jacket extends Clothing {

    @Override
    public void personDressCloth(Person person) {
        System.out.println(person.getType() + "穿马甲");
    }
}
java 复制代码
public class Pants extends Clothing {

    @Override
    public void personDressCloth(Person person) {
        System.out.println(person.getType() + "穿裤子");
    }
}

测试类

java 复制代码
public class Client {

    public static void main(String[] args) {
        Person man = new Man();
        Person lady = new Lady();

        Clothing jacket = new Jacket();
        Clothing pants = new Pants();

        jacket.personDressCloth(man);
        pants.personDressCloth(man);

        jacket.personDressCloth(lady);
        pants.personDressCloth(lady);
    }
}

输出结果

男人穿马甲
男人穿裤子
女人穿马甲
女人穿裤子

4、桥接模式优缺点

4.1优点
  • 分离抽象接口及其实现部分。使用对象间的关联关系解耦了抽象和现实之间固有的绑定关系,使抽象和实现可以沿着各自的维度来变化
  • 桥接模式在有些情况下可以取代多层继承方案,极大减少了子类的个数
  • 提高了系统的可扩展性,在两个变化维度中任意扩展一个维度都不需要修改原有系统,符合开闭原则
4.2缺点
  • 增加系统的理解与设计难度,关联关系建立在抽象层
  • 要求正确的识别出系统中的两个独立变化的维度,因此其适用范围具有一定的局限性

5、桥接模式的适用环境

1.不需要在抽象和它的实现部分之间有一个固定的绑定关系,在程序运行时刻实现部分程序可以被选择或者切换。

2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。 这时桥接模式可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

3.对一个抽象的实现部分的修改应对其他业务不产生影响,即其他业务的代码不必重新编译。

4.需要在多个对象间共享实现(可能使用引用计数),但同时需要对其他业务无感知。

相关推荐
诸葛悠闲几秒前
设计模式——装饰模式
设计模式
西岭千秋雪_2 分钟前
设计模式の中介者&发布订阅&备忘录模式
java·观察者模式·设计模式·中介者模式·备忘录模式
捕鲸叉3 分钟前
C++软件设计模式之代理(Proxy)模式
c++·设计模式
思忖小下8 分钟前
梳理你的思路(从OOP到架构设计)_介绍GoF设计模式
设计模式·架构·eit
憶巷9 分钟前
MyBatis中动态SQL执行原理
java·sql·mybatis
重生之绝世牛码9 分钟前
Java设计模式 —— 【结构型模式】享元模式(Flyweight Pattern) 详解
java·大数据·开发语言·设计模式·享元模式·设计原则
seasugar14 分钟前
记一次Maven拉不了包的问题
java·maven
Allen Bright23 分钟前
【Java基础-26.1】Java中的方法重载与方法重写:区别与使用场景
java·开发语言
苹果酱056724 分钟前
Golang的文件解压技术研究与应用案例
java·vue.js·spring boot·mysql·课程设计
秀儿y27 分钟前
单机服务和微服务
java·开发语言·微服务·云原生·架构