java 设计模式之桥接模式(六)

爱情是需要付出和舍得的,当你想要得到一份刻骨铭心的爱情时,你就必须作好承受刻骨铭心之苦的准备,否则,就不要轻易去尝试。

设计模式学习,近期我会把23中设计模式都写成博客,敬请期待~

– 2021/1/9

什么是桥接模式?

桥接模式,又叫桥梁模式,将抽象部分与它实现部分分离,使它们都可以独立地变化。

百度百科

使用场景

当我们发现类有多层继承时就可以考虑使用桥接模式,用聚合代替继承。

举例

来看看这张图:

网络图(1.1):


分析:

假设我们要去买电脑,电脑又分为:

  • 台式电脑
  • 笔记本电脑
  • 平板电脑

台式电脑又可以细分为联想台式,苹果台式等等,笔记本和平板也是一样

如果正常思维写代码是不是要把电脑类当做顶级的Base

然后台式电脑,笔记本电脑,平板电脑分别继承自电脑类

最后联想台式,苹果台式,戴尔台式又分别继承自台式电脑…

那么如果这么写的话有什么问题?

他是不是会出现多继承的关系,就是一层继承一层,代码就会出现高度耦合性,导致代码不利于维护,而且你改一个地方,另一个地方很有可能冲突,

比如说我想改台式电脑的显示器,我改了一处地方,继承他的子类就有可能有冲突问题.(这里的子类指联想台式,苹果台式,戴尔台式)

就拿联想台式来说:

  • 联想是一个品牌
  • 电脑是一个产品

品牌和产品混合到个类中违反了单一职责原则

解决思路

网络图(1.2):


如果这么写代码的话是不是就会好很多呢?

把苹果,联想,戴尔,归到品牌

平板,笔记本,台式机归到类型

如果我要苹果台式机是不是红框的位置(查看网络图(1.2))

如果我要联想笔记本是不是蓝框的位置(查看网络图(1.2))

如果我要苹果平板是不是黑框的位置(查看网络图(1.2))


再以苹果台式机来举例:

网络图(1.3):


台式机属于类型,苹果属于品牌,连接他们的点就是桥

现在大家心里是不是应该有解决的思路了呢?

吧品牌和类型单独做成一个抽象类

然后苹果,联想,戴尔实现品牌类

平板笔记本台式实现类型

然后通过组合的方式把他们组合到一起,这样就实现了’桥’

代码实现

IBrand品牌类:

public abstract class ABrand {
    
    
   public abstract void info();
}

AType类型类:

public abstract class AType {
    
    
    public abstract void type();
}

接下来分别实现:

Dell(戴尔)是一个品牌,实现品牌:

public class Dell extends ABrand {
    
    
    @Override
    public void info() {
    
    
        Log.i("桥接模式","戴尔");
    }
}

Lenovo(联想)是一个品牌,实现品牌:

public class Lenovo  extends ABrand {
    
    
    @Override
    public void info() {
    
    
        Log.i("桥接模式","联想");
    }
}

Computer(电脑)是类型,实现AType,把品牌(ABrand)组合进来:

public class Computer extends AType {
    
    
    private ABrand brand;//相当于桥 品牌
    
    public Computer(ABrand brand) {
    
    
        this.brand = brand;
    }
    @Override
    public void type() {
    
    
        brand.info();
        Log.i("桥接模式:","电脑");
    }
}

Computer(笔记本)是类型,实现AType,把品牌(ABrand)组合进来:

public class Notebook extends AType {
    
    
    private ABrand brand;
    public Notebook(ABrand brand) {
    
    
        this.brand = brand;
    }
    @Override
    public void type() {
    
    
        brand.info();
        Log.i("桥接模式:","笔记本");
    }
}

使用代码(示例一):

 //电脑 品牌
Computer computer = new Computer(new Lenovo());
computer.type();

电脑里面传入联想品牌,得到联想电脑

Log图(2.1):


使用代码(示例二):

//电脑 品牌
Computer computer = new Computer(new Lenovo());
computer.type();

Notebook notebook = new Notebook(new Dell());
notebook.type();

new 笔记本,传入Dell品牌,得到戴尔笔记本!

Log图(2.1):

总结

好处:

  • 桥接模式偶尔类似于多继承,但多继承违背了单一职责原则,复用性比较差,桥接模式极大的减少了子类的个数,从根本上维护了成本,降低了管理
  • 桥接模式满足开闭原则(对扩展开放,对修改关闭),如果增加新的一个’纬度’比如说,雷神品牌,可以轻易的获得雷神电脑,雷神笔记本等

缺点:

  • 桥接模式会增加代码的设计难度,聚合关系建立在抽象层,对开发者有一定的要求
  • 桥接模式适用于2个独立的’纬度’(品牌和类型),有一定的局限性

完整代码

设计模式/设计原则目录

原创不易,您的点赞就是对我最大的支持,留下您的点赞吧~

猜你喜欢

转载自blog.csdn.net/weixin_44819566/article/details/112387613