• 设计模式之桥梁模式


    什么是桥梁模式

    桥梁模式(Bridge Pattern)也称为桥接模式,属于结构型模式,它主要目的是通过组合的方式建立两个类之间的联系,而不是继承。桥梁模式将抽象部分与它的具体实现部分分离,使它们都可以独立地变化。

    桥梁模式的核心角色

    桥梁模式的实现通常包括以下四个角色:

    1. Abstraction——抽象化角色:它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
    2. Implementor——实现化角色:它是接口或者抽象类,定义角色必需的行为和属性。
    3. RefinedAbstraction——修正抽象化角色:它引用实现化角色对抽象化角色进行修正。
    4. ConcreteImplementor——具体实现化角色:它实现接口或抽象类定义的方法和属性。

    桥梁模式如何实现

    小王是一个富二代,家里的产业很多,开煤矿、搞房地产等等,如果设计一个程序来帮助小王来管理家族产业,那么应该怎么实现呢?这里就可以使用桥梁模式来实现。为什么可以使用桥梁模式呢?原因是这样的,小王家大业大、善于投资,这些产业可能会发生变化,比如煤矿不挣钱了,就改搞新能源;如果房地产不挣钱了,那就搞酒店住宿,可以看出来具体的业务可能会发生变化;那有没有不会发生变化的东西?当然有。这么大的产业,一般会成立一些子公司分别来管理这些产业,然后通过一个母公司来控制这些子公司。

    那这里的母公司就是抽象化角色(Abstraction),子公司就是实现化角色(RefinedAbstraction),这些不同的产业可以抽象为产品类,即实现化角色(Implementor),产品有两个共同的行为,被生出来、被销售出去,煤碳、房产等这些就是具体的具体实现化角色(ConcreteImplementor),下面就用代码来演示一个这个过程:

    1. MotherCompany:抽象化母公司,属于抽象化角色(Abstraction)
    2. CoalCompany:煤炭公司袱类,属于实现化角色(RefinedAbstraction)
    3. HouseCompany:房产公司类,继承于MotherCompany,属于具体实现化角色(ConcreteImplementor)
    4. Product:抽象产品类,即实现化角色(Implementor)
    5. House:房产实体类,继承于Product,属于具体实现化角色(ConcreteImplementor)
    6. Coal,煤炭实体类,继承于Product,属于具体实现化角色(ConcreteImplementor)
    1. /**
    2. * 抽象产品,实现化角色(Implementor)
    3. */
    4. public abstract class Product {
    5. /**
    6. * 被生产出来
    7. */
    8. public abstract void beProduted();
    9. /**
    10. * 被销售出去
    11. */
    12. public abstract void beSelled();
    13. }
    1. /**
    2. * 煤炭,具体实现化角色(ConcreteImplementor)
    3. */
    4. public class Coal extends Product{
    5. @Override
    6. public void beProduted() {
    7. System.out.println("煤炭生产");
    8. }
    9. @Override
    10. public void beSelled() {
    11. System.out.println("煤炭销售");
    12. }
    13. }
    1. /**
    2. * 房产,具体实现化角色(ConcreteImplementor)
    3. */
    4. public class House extends Product{
    5. @Override
    6. public void beProduted() {
    7. System.out.println("房产生产");
    8. }
    9. @Override
    10. public void beSelled() {
    11. System.out.println("房产销售");
    12. }
    13. }
    1. /**
    2. * 母公司就是抽象化角色(Abstraction)
    3. */
    4. public abstract class MotherCompany {
    5. private Product product;
    6. public MotherCompany(Product product) {
    7. this.product = product;
    8. }
    9. public void mange(){
    10. this.product.beProduted();
    11. this.product.beSelled();
    12. }
    13. }
    1. /**
    2. * 煤炭公司,实现化角色(RefinedAbstraction)
    3. */
    4. public class CoalCompany extends MotherCompany{
    5. public CoalCompany(Product product) {
    6. super(product);
    7. }
    8. @Override
    9. public void mange() {
    10. super.mange();
    11. System.out.println("今年煤炭生意火爆");
    12. }
    13. }
    1. /**
    2. * 房产公司,实现化角色(RefinedAbstraction)
    3. */
    4. public class HouseCompany extends MotherCompany{
    5. public HouseCompany(Product product) {
    6. super(product);
    7. }
    8. @Override
    9. public void mange() {
    10. super.mange();
    11. System.out.println("今年房地产生意不好");
    12. }
    13. }
    1. public class Test {
    2. public static void main(String[] args) {
    3. Product product=new Coal();
    4. MotherCompany motherCompany=new CoalCompany(product);
    5. motherCompany.mange();
    6. System.out.println("----------------");
    7. product=new House();
    8. motherCompany=new HouseCompany(product);
    9. motherCompany.mange();
    10. }
    11. }

    如果小王家又新增投资旅游产业,开了一家景点经营公司,怎么办呢?新增一个旅游公司的类、门票类,就可以了,原来的业务不用改,完全符合开闭原则

    1. /**
    2. * 门票
    3. */
    4. public class Ticket extends Product {
    5. @Override
    6. public void beProduted() {
    7. System.out.println("印刷门票");
    8. }
    9. @Override
    10. public void beSelled() {
    11. System.out.println("卖门票");
    12. }
    13. }
    1. /**
    2. * 旅游公司
    3. */
    4. public class TourismCompany extends MotherCompany{
    5. public TourismCompany(Product product) {
    6. super(product);
    7. }
    8. @Override
    9. public void mange() {
    10. super.mange();
    11. System.out.println("旅游人数爆火");
    12. }
    13. }
    1. public class Test {
    2. public static void main(String[] args) {
    3. Product product=new Ticket();
    4. MotherCompany motherCompany=new TourismCompany(product);
    5. motherCompany.mange();
    6. }
    7. }

    桥梁模式的适用场景

    桥梁模式的应用场景包括:

    1. 当你想要解耦抽象和具体类时,例如在软件系统中,抽象和具体的功能经常需要变化,而通过使用桥梁模式,你可以将它们解耦,使得你可以在不改变其他部分的情况下更改它们。
    2. 当你需要实现可扩展的软件系统时,桥梁模式可以帮助你实现更灵活的架构,因为你可以在不影响其他部分的情况下添加新的具体实现。
    3. 当你需要隐藏实现的细节时,桥梁模式可以帮助你隐藏实现的细节,只暴露公共接口,这样客户端只需要和抽象类打交道,不需要关心具体的实现细节。

    总结

    优点

    创建灵活且易于扩展的软件产品、简化客户端代码、易于维护和修改等。

    缺点

    如增加系统的复杂性和理解难度、需要正确地识别出系统中两个独立变化的维度、需要对系统进行递归处理等。

    总的来说,桥梁模式是一种结构型设计模式,它通过将抽象和具体解耦,使得它们可以独立地变化,从而提高了系统的灵活性和可扩展性,但同时也需要仔细考虑和设计才能正确应用。

     

  • 相关阅读:
    DSPE-PEG-DBCO 磷脂-聚乙二醇-二苯并环辛炔供应 X-GF-0295-10k
    JAVA系列之JVM内存调优
    【深度学习】
    二叉搜索树 , Set 和 Map (JAVA)
    【408数据结构与算法】—队列的顺序表示和实现(十三)
    C#生成putty格式的ppk文件(支持passphrase)
    【C/C++】万字图文详解C语言文件操作 完美装饰课设大作业
    【附源码】Python计算机毕业设计图书商城购物系统
    了解网上展馆的特点和优势,网上展馆带来展示新方式
    基于Springboot+Vue实现前后端分离商城管理系统
  • 原文地址:https://blog.csdn.net/fox9916/article/details/134080943