首页 > 其他分享 >桥接模式(Bridge Pattern)

桥接模式(Bridge Pattern)

时间:2023-05-21 14:55:28浏览次数:48  
标签:Bridge String 桥接 Pattern 模式 public penType name

模式动机

桥接模式(Bridge Pattern)是一种很实用的结构型模式,如果系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使得两者可以独立扩展。桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多重继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩展,同时有效地控制了系统中类的个数。

模式定义

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

  • 对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式
  • 用抽象关联取代了传统的多层继承
  • 将类之间的静态继承关系转换为动态的对象组合关系

模式结构

image

案例实现

案例背景

毛笔:颜色和型号实现了分离,增加新的颜色或者型号对另一方没有任何影响

案例结构

image

代码实现

抽象类

public abstract class Pen {

    protected Color color;

    public void setColor(Color color) {
        this.color = color;
    }

    public abstract void draw(String name);
}

细化抽象类

public class BigPen extends Pen {
    @Override
    public void draw(String name) {
        String penType = "大号毛笔绘制";
        this.color.bepaint(penType,name);
    }
}
public class MiddlePen extends Pen {

    @Override
    public void draw(String name) {
        String penType = "中号毛笔绘制";
        this.color.bepaint(penType,name);
    }
}
public class SmallPen extends Pen {
    @Override
    public void draw(String name) {
        String penType = "小号毛笔绘制";
        this.color.bepaint(penType,name);
    }
}

接口

public interface Color {
    //用于图形着色的方法
    void bepaint(String penType,String name);

}

接口实现类

public class Red implements Color {
    @Override
    public void bepaint(String penType, String name) {
        System.out.println(penType+"红色的"+name+".");
    }
}

public class White implements Color {
    @Override
    public void bepaint(String penType, String name) {
        System.out.println(penType+"白色的"+name+".");
    }
}

public class Green implements Color {
    @Override
    public void bepaint(String penType, String name) {
        System.out.println(penType+"绿色的"+name+".");
    }
}

public class Blue implements Color {
    @Override
    public void bepaint(String penType, String name) {
        System.out.println(penType+"蓝色的"+name+".");
    }
}

public class Black implements Color {
    @Override
    public void bepaint(String penType, String name) {
        System.out.println(penType+"黑色的"+name+".");
    }
}

客户类

public class Client {

    public static void main(String[] args) {

        Color color;
        Pen pen;
        color = (Color) XMLUtilPen.getBean("color");
        pen = (Pen) XMLUtilPen.getBean("pen");

        pen.setColor(color);
        pen.draw("鲜花");

    }

}

实现结果

image

模式分析

  • 桥接模式中体现了很多OOP的思想,包括开闭原则合成复用原则里氏代换原则依赖倒转原则等。
  • 桥接模式可以从接口中分离实现功能,设计更具有扩展性。
  • 桥接模式减少了子类个数,代码简洁。
  • 重点理解如何将抽象化(Abstraction)和实现化(Implementation)脱耦,使得两者可以独立变化。
  • 脱耦
    • 抽象化和实现化之间的耦合解开,或者说是将强关联改换成弱关联,将两个角色之间的继承关系改为关联关系
    • 桥接模式中的所谓脱耦就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合)而不是继承关系,从而使得两者可以相对独立地变化。
    • 继承是强耦合关系。

总结

模式优点

  • 分离抽象接口及其实现部分
  • 可以取代多层继承方案,极大地减少了子类的个数
  • 提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则

模式缺点

  • 会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就要针对抽象层进行设计与编程
  • 正确识别出系统中两个独立变化的维度并不是一件容易的事情

应用情形

  • 需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系
  • 抽象部分和实现部分可以以继承的方式独立扩展而互不影响
  • 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展
  • 不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统

模式扩展

桥接模式与适配器模式经常联合使用,适配器模式可以解决两个已有接口间不兼容的问题,适配器采用增加适配器的方式将第三方类集成到系统中;而桥接模式则通过接口继承或者类继承的方式对系统进行扩展。两个模式用于设计的不同阶段,通常情况下桥接模式用于系统的初步设计,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行变化。初步设计完成后,当发现系统与已有类无法协同工作时,可以采用适配器模式。

标签:Bridge,String,桥接,Pattern,模式,public,penType,name
From: https://www.cnblogs.com/sorrymine/p/17418594.html

相关文章

  • ROSBridge简介以及理解使用
    安卓与ROS通信的现状因为ROS官方支持的语言绑定只有C++和Python,所以目前安卓想与ROS通信,必须借助半官方的rosjava包,而Rosjava太重了,因为它跟C++/Python一样,是一个全功能的ROS绑定,意即你可以在Java(android)平台上创建MasterNode,然后其他Node(C++/Python)可以连上这个Master,进行分布式......
  • Windows Server2019网卡桥接与网卡聚合在实际工作中经验总结
    WindowsServer2019网卡桥接与网卡聚合在实际工作中经验总结1、WindowsServer2019网卡桥接与网卡聚合的区别   桥接:只是在服务器端的多个网卡进行桥接,交换机端不能做聚合,在实际工作中,桥接网卡会产MAC地址漂移,如果用MAC地址控制会产生断网故障。(注意:这是服务这边桥接,交换......
  • cpp: Facade Pattern
     /*****************************************************************//***\fileGoldGraphic.h*\briefFacadePattern外观模式*涂聚文GeovinDuVisualStudio2022edit.*\authorgeovindu*\dateMay2023*************************************......
  • cpp: Singleton Pattern
     //GoldConfig.h:此文件包含"GoldConfig"类。装饰器模式SingletonPatternC++14////SingletonPattern单例模式单件模式、Singleton//2023年5月20日涂聚文GeovinDuVisualStudio2022edit.#pragmaonce#ifndefGOLDCONFIG_H#defineGOLDCONFIG_H#i......
  • 模板模式(Template Pattern)
    模板模式一、介绍  模板模式(TemplatePattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方式使......
  • 组合模式(Composite Pattern)
    组合模式一、概述  组合模式(CompositePattern):组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。二、介绍......
  • 策略模式(Strategy Pattern)
    策略模式一、介绍  在策略模式(StrategyPattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。意图:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。主要解决:在有多种算法相似的情况下,使用if...else所带来的复杂和难以维护......
  • AHB2APB bridge 简介
    背景介绍AMBA总线规范是由ARM公司提出的一种开放性的片上总线标准,它独立于处理器和工艺技术,具有高速度、低功耗等特点。AMBA规范中包括了AHB系统总线和APB外设总线。AHB主要用于高性能模块(如CPU、DMA和DSP等)之间的连接,作为SoC的片上系统总线,它包括以下一些特性:单个时钟边沿操......
  • Java设计模式-桥接模式
    简介桥接模式(BridgePattern)是一种结构性设计模式,它的主要作用是将抽象部分和实现部分解耦,使它们可以独立变化而不会互相影响。桥接模式最早由GoF(GangofFour)提出,在《设计模式》一书中有详细的介绍。桥接模式和其他设计模式的区别在于它关注的是如何将抽象和实现分离,从而达到灵......
  • cpp: Observer Pattern II
     //SupperGold.h:此文件包含"SupperGold"类。ObserverPattern观察者模式C++14//JewelryObserverPattern观察者模式//2023年5月10日涂聚文GeovinDuVisualStudio2022edit.#pragmaonce#ifndefSUPPERGOLD_H#defineSUPPERGOLD_H#include<io......