ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【设计模式】为什么要叫桥接模式?学完了我也没搞懂!

2021-10-23 10:01:28  阅读:174  来源: 互联网

标签:桥接 实现 抽象 抽象化 device 搞懂 设计模式 public


什么是桥接模式(Bridge)

概念

桥接模式的定义如下:**将抽象与实现分离,使它们可以独立变化。**这个概念说得很抽象,意思是将实现部分中的抽象部分分离出来,让抽象部分和实现部分间的耦合度降低。

抽象化:将复杂事物中共同的特性抽象出来,对于面向对象来说就是把各种对象的特性抽象成一个类。

实现化:针对抽象化的具体实现。

桥接模式主张采用组合关系代替多层继承关系,继承关系会让实现类数量呈指数级增长,类的耦合程度也会提高。

image-20210530221708093

例如,现在想要设计产品类,小米和华为都有手机和平板,现在想要设计它们的产品类,如果想要通过继承的方式去设计,那么类的数量就是n * m=2 * 2,如果以后想再加一个产品,就是2 * 3了,如果加n个产品和n个品牌,类的数量就会爆炸式增长。

image-20210530222038727

如果采用组合的方式来设计的话,只需要设计手机设备类、平板设备类、华为品牌类、小米品牌类,然后具体的实现由它们去组合就可以了。可以看到,虽然现在也是需要创建四个类,但如果想要再增加一个产品,就只需要再写多一个类。

优点

  1. 抽象和实现分离,提高系统可扩展性
  2. 符合开放封闭原则
  3. 提高了类的复用。
  4. 降低类间的耦合程度。

挺不错

缺点

  1. 需要对系统需求的理解,能够清除需要实现什么功能的类,以及一定的针对抽象层设计能力,能够在两个维度把这些类区分开来。
  2. 存在一定的局限性。桥接模式在能够正确识别出两个维度的情况下才可以使用。

总体来说就是对设计有要求。

我觉得海星

原则

“+”代表遵守,“-”代表不遵守或者不相关

原则开放封闭单一职责迪米特里氏替换依赖倒置接口隔离合成复用
++--+++

适用场景(动机)

  1. 存在多层继承。使用桥接模式来处理这种情况可以避免系统类指数级增涨的情况。
  2. 实现类会在两个独立变化的维度上扩展。这也是桥接模式在做的事情。

如何实现

想要实现桥接模式,就需要以下几个东西:

  1. 抽象化抽象类:定义一个抽象类,对抽象化接口进行一个引用,达成和抽象化接口的组合关系。
  2. 抽象化抽象类的实现类:这些类用来实现业务逻辑。
  3. 抽象化接口:另外一个维度的抽象层,供抽象化抽象类调用。
  4. 抽象化接口实现类:实现该维度的业务逻辑。

抽象化只是我想加的一个形容词,加上有点长,不加又觉得意思不够,觉得长的可以省略掉。

上类图

image-20210530230403443

上代码

这里实现上述的手机品牌的例子

抽象化抽象类:Abstraction

/**
 *
 * 模拟品牌类
 * Created on 2021/5/30.
 *
 * @author xuxiaobai
 */
public abstract class Abstraction {
    protected Implementor device;

    public Abstraction(Implementor device){
        this.device=device;
    }

    public abstract void operate();

}

抽象化抽象类的实现类:RefinedAbstraction

/**
 *
 * 模拟小米品牌类
 * Created on 2021/5/30.
 *
 * @author xuxiaobai
 */
public class RefinedAbstraction extends Abstraction{


    public RefinedAbstraction(Implementor device) {
        super(device);
    }

    @Override
    public void operate() {
        System.out.print("this is xiaomi:");
        device.operate();
    }
}

抽象化接口:Implementor

/**
 * 模拟设备类
 *
 * Created on 2021/5/30.
 *
 * @author xuxiaobai
 */
public interface Implementor {

    void operate();
}

抽象化接口实现类:

/**
 *
 * 模拟手机设别类
 * Created on 2021/5/30.
 *
 * @author xuxiaobai
 */
public class ConcreteImplementor implements  Implementor{
    @Override
    public void operate() {
        System.out.println("手机");
    }
}

测试类:BridgeTest

public class BridgeTest {
    public static void main(String[] args) {
        Abstraction phone = new RefinedAbstraction(new ConcreteImplementor());

        phone.operate();
        
    }
    /**
     * 输出结果:
     * this is xiaomi:手机
     */
}

这里简单地做了一个手机品牌的例子,

关机,下班

总结

桥接模式主要遵守了依赖倒置原则,也是在提倡接口编程,提供了一个接口编程的方式,遵守了里氏替换原则、单一职责原则,开放封闭原则,总之就是基本上满足大部分设计原则,是一个非常优秀的设计模式,实现起来也不会太难。我们在设计类结构的时候能用上就用上。

当积累了一定的开发经验,可能也会自然而然地就用上这个模式了,我之前也遇到过一个程序员,没有学过设计模式,他也很轻视地跟我说学这些有什么用,我没学也一样能够完成需求。确实,他在一次设计类结构时就是用到了桥接模式,我也是后知后觉。我也不是叫大家不要学习设计模式,毕竟设计模式是前人总结的经验,学习能让我们少走一些弯路。

卷起来了

我觉得在抽象层的设计,多个维度也是可以的,只需要定义多个抽象化接口即可,不过多个维度情况很少,太多维度了,使用者也是把握不住的。

标签:桥接,实现,抽象,抽象化,device,搞懂,设计模式,public
来源: https://blog.csdn.net/weixin_45865724/article/details/120589369

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有