设计模式之桥接模式

简介: 我们都去买过手机,手机按照品牌分可以分为华为、小米、oppo、vivo等品牌,如果这些手机按照内存分又可以分为4G、6G、8G等等。假如我们每一种手机都想要玩一下,至少需要4*3个。这对我们来说这些手机也太多了,竟然有12个,最主要的是手机品牌和内存是放在一起的。现在有这样一种机制,手机牌品商是一个公司,做手机内存的是一个公司,想要做什么手机我们只需要让其两者搭配起来即可。有点类似于全球贸易分工明确的思想,这就是桥接模式,把两个不同维度的东西桥接起来

一、认识桥接模式


1、概念


将抽象部分与它实现部分分离,使它们都可以独立地变化。


2、例子说明


从上面的例子我们可以看到,我们的手机可以从两个维度进行变化,一个是品牌,一个是内存。此时我们就可以通过桥接模式将这两个维度分离开来,每一个维度都可以独立扩展。比如说手机品牌,可以又出现了苹果、三星、锤子等等。内存方面又可以生产10G、16G的了。从专业的角度来看可以这样定义桥接模式:


桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。


3、类图


上面的例子我们画一张类图来表示一下:v2-b5cec241dce329a3dfe5677b23a0a67e_1440w.jpg

基本上意思就是这,也就是我们买手机的时候有两个维度可供我们选择:一个是品牌一个是内存。


(1)client:指的是我们买手机的人。

(2)Abstraction(抽象类):指的是手机抽象类

(3)Refined Abstraction(具体类):指的是具体手机品牌

(4)Implementor:在这里相当于手机的其他组件,内存

(5)ConcreteImplementor:具体的内存型号。


下面我们就使用代码来实现一下。


二、实现桥接模式


第一步:定义Implementor,这里定义手机内存接口

public interface Memory {
    public void addMemory();
}

第二步:定义ConcreteImplementor,这里指具体的内存


内存这里定义了两种一种是6G,一种是8G

//6G内存
public class Memory6G implements Memory{
    @Override
    public void addMemory() {
        System.out.println("手机安装了6G内存");
    }
}
//8G内存
public class Memory8G implements Memory{
    @Override
    public void addMemory() {
        System.out.println("手机安装了8G内存");
    }
}


第三步:定义Abstraction手机抽象类


public abstract class Phone {
    public Memory phoneMemory;
    public void setMemory(Memory memory) {
        this.phoneMemory=memory;
    }
    public abstract void buyPhone();
}


第四步:定义Refined Abstraction(具体的手机品牌)


首先是华为


public class HuaWei extends Phone {
    @Override
    public void buyPhone() {
        //memory是继承自父类调用的setMemory中的方法
        phoneMemory.addMemory();
        System.out.println("购买华为手机");
    }
}

然后是小米

public class Mi extends Phone {
    @Override
    public void buyPhone() {
        //memory是继承自父类调用的setMemory中的方法
        phoneMemory.addMemory();
        System.out.println("购买小米手机");
    }
}


第五步:测试一下


public class Client {
    public static void main(String[] args) {
        //让华为搭配8G内存
        Phone huawei=new HuaWei();
        huawei.setMemory(new Memory8G());
        huawei.buyPhone();
        //让小米搭配6G内存
        Phone mi=new Mi();
        mi.setMemory(new Memory6G());
        mi.buyPhone();
    }
}
//output
//手机安装了8G内存
//购买华为手机
//手机安装了6G内存
//购买小米手机

从代码就可以看出,购买手机的时候,品牌和内存两个维度是分开的。下面我们分析一下这个桥接模式


三、分析桥接模式


1、为什么使用桥接模式不使用继承呢?


继承是一种强耦合关系,子类与父类有非常紧密的依赖关系,父类的任何变化 都会导致子类发生变化。因此才使用桥接模式,使用了桥接模式之后,我们的两个维度就像桥梁一样被链接了起来。体现了松耦合的特性。


2、桥接模式的优点


(1)分离抽象和实现部分:把手机、内存抽象出来。实现与之分离。

(2)松耦合:两个维度分开

(3)单一职责原则:每个维度各干各的活

关于桥接模式的使用场景我觉得你只需要知道他的思想,然后在遇到问题的时候能够想到这种模式即可。

OK,今天的文章就到这,如有问题还请批评指正。



相关文章
|
6月前
|
设计模式 开发者
【设计模式】第七篇:和我一起简单认识桥接模式
实现的意思并不是指抽象的派生类,而是指通过组合来代替继承关系,从而降低抽象和具体实现产品两个可变换维度之间的耦合,就像我们的相机品牌和相机产品类型之间的分离
54 4
|
7月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Bridge(桥接模式)
【设计模式】JAVA Design Patterns——Bridge(桥接模式)
【设计模式】JAVA Design Patterns——Bridge(桥接模式)
|
7月前
|
设计模式 Oracle Java
设计模式--- 桥接模式、JDBC 源码剖析(桥接)
设计模式--- 桥接模式、JDBC 源码剖析(桥接)
123 2
|
7月前
|
设计模式
设计模式之桥接模式
设计模式之桥接模式
|
7月前
|
设计模式 Linux Windows
【设计模式】桥接模式
【设计模式】桥接模式
|
2月前
|
设计模式 PHP 开发者
PHP中的设计模式:桥接模式的解析与应用
在软件开发的浩瀚海洋中,设计模式如同灯塔一般,为开发者们指引方向。本文将深入探讨PHP中的一种重要设计模式——桥接模式。桥接模式巧妙地将抽象与实现分离,通过封装一个抽象的接口,使得实现和抽象可以独立变化。本文将阐述桥接模式的定义、结构、优缺点及其应用场景,并通过具体的PHP示例代码展示如何在实际项目中灵活运用这一设计模式。让我们一起走进桥接模式的世界,感受它的魅力所在。
|
3月前
|
设计模式 自然语言处理 算法
PHP中的设计模式:桥接模式的深入探索与应用
在PHP开发中,理解并运用设计模式是提升代码质量与可维护性的关键。本文聚焦于桥接模式——一种结构型设计模式,它通过封装一个抽象的接口,将实现与抽象分离,从而使得它们可以独立变化。不同于传统摘要的概述式表述,本文将以故事化的情境引入,逐步解析桥接模式的精髓,通过PHP代码示例详细展示其在实际项目中的应用,旨在为读者提供一个既深刻又易于理解的学习体验。
27 1
|
3月前
|
设计模式 Java
Java设计模式-桥接模式(9)
Java设计模式-桥接模式(9)
|
2月前
|
设计模式 Java
Java设计模式之桥接模式
这篇文章介绍了Java设计模式中的桥接模式,包括桥接模式的目的、实现方式,并通过具体代码示例展示了如何分离抽象与实现,使得两者可以独立变化。
45 0
|
4月前
|
设计模式 XML 存储
【七】设计模式~~~结构型模式~~~桥接模式(Java)
文章详细介绍了桥接模式(Bridge Pattern),这是一种对象结构型模式,用于将抽象部分与实现部分分离,使它们可以独立地变化。通过实际的软件开发案例,如跨平台视频播放器的设计,文章阐述了桥接模式的动机、定义、结构、优点、缺点以及适用场景,并提供了完整的代码实现和测试结果。桥接模式适用于存在两个独立变化维度的系统,可以提高系统的可扩展性和灵活性。
【七】设计模式~~~结构型模式~~~桥接模式(Java)