桥接模式

桥接模式

桥接模式(Bridge Pattern)将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种模式有助于减少类的数量,因为它将一个类层次结构中的两个维度(例如,抽象和实现)解耦,使得两者可以独立地扩展。

桥接(Bridge)模式包含以下主要角色:

  • 系统设计期间,如果这个类里面的一些东西,会扩展很多,这个东西就应该分离出来
  • 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
  • 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。

案例

现在我们需要销售手机,但不同的手机品牌会有不同的销售渠道,我们需要将销售渠道从手机类中分离出来:

抽象手机类:

java 复制代码
public abstract class AbstractPhone {
    AbstractSale sale;

    public void setSale(AbstractSale sale){
        this.sale = sale;
    }
    public abstract void getPhone();
}

抽象销售渠道类:

java 复制代码
public class AbstractSale {
    String type;
    String price;
    public AbstractSale(String type,String price){
        this.price = price;
        this.type = type;
    }
    public String getSaleInfo(){
        return "销售渠道:"+this.type + ",销售价格:"+this.price;
    }
}

手机实现类:

java 复制代码
public class Iphone extends AbstractPhone{
    @Override
    public void getPhone() {
        System.out.println(sale.getSaleInfo());
    }
}
java 复制代码
public class MiPhone extends AbstractPhone{
    @Override
    public void getPhone() {
        System.out.println(sale.getSaleInfo());
    }
}

不同的销售渠道:

java 复制代码
public class OffSale extends AbstractSale{
    public OffSale(String type, String price) {
        super(type, price);
    }
}
java 复制代码
public class OnSale extends AbstractSale{
    public OnSale(String type, String price) {
        super(type, price);
    }
}

测试:

java 复制代码
public class Main {
    public static void main(String[] args) {
        Iphone iphone = new Iphone();
        iphone.setSale(new OffSale("线下","9999"));
        iphone.getPhone();

        MiPhone miPhone = new MiPhone();
        miPhone.setSale(new OnSale("线上","1999"));
        miPhone.getPhone();
    }
}

使用场景用:

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
  • 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
相关推荐
梵刹古音1 分钟前
【C语言】 循环结构
c语言·开发语言·算法
消失的旧时光-19434 分钟前
C++ 函数参数传递方式总结:什么时候用值传递、引用、const 引用?
开发语言·c++
2601_949868365 分钟前
Flutter for OpenHarmony 剧本杀组队App实战04:发起组队表单实现
开发语言·javascript·flutter
一匹电信狗6 分钟前
【C++】CPU的局部性原理
开发语言·c++·系统架构·学习笔记·c++11·智能指针·新特性
编程彩机7 分钟前
互联网大厂Java面试:从分布式事务到微服务优化的技术场景解读
java·spring boot·redis·微服务·面试·kafka·分布式事务
bbq粉刷匠8 分钟前
Java-排序2
java·数据结构·排序算法
m0_5613596710 分钟前
C++代码冗余消除
开发语言·c++·算法
编程彩机10 分钟前
互联网大厂Java面试:从Spring WebFlux到分布式事务的技术场景解析
java·微服务·面试·分布式事务·spring webflux
毕设源码-郭学长12 分钟前
【开题答辩全过程】以 基于Python爬取学院师资队伍信息的设计与分析为例,包含答辩的问题和答案
开发语言·python
会开花的二叉树14 分钟前
吃透Reactor多线程:EventLoop_Channel_ThreadPool协作原理
开发语言·c++·tcp/ip·servlet