设计模式-桥接模式

目录

一.设计模式-桥接模式

        1.基本介绍 

二、桥接模式的应用场景 

三、桥接模式的角色组成 

        抽象(Abstraction):

        修正抽象(RefinedAbstraction):

        实现(Implementor):

四.案例

五.代码实现

        运行效果图:

        从结果可以看出来:

六、桥接模式优缺点


一.设计模式-桥接模式

        1.基本介绍 

桥接模式(Bridge模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变
是一种结构型设计模式
Bridge模式基于类的最小原则设计,通过使用封装,聚合以及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保证各部分独立性以及应对他们的功能扩展
桥接模式的注意事项和细节

实现了抽象和实现部分的分离,从而极大提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统分层设计,从而产生更好的结构化系统
对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其他的部分由具体的业务来完成
桥接模式代替多层继承方案,可以减少子类的个数,降低系统的管理和维护成本
桥接模式的引入增加了系统的理解和设计难度,由于聚合关系建立在抽象层,要求开发人员针对抽象进行设计和编程
桥接模式要求正确识别出系统中两个独立变化的维度,因此使用范围有一定的局限性,即需要这样的应用场景

二、桥接模式的应用场景 

当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。桥接模式适用于以下几种业务场景:

在抽象和具体实现之间需要增加更多的灵活性的场景
一个类存在两个或多个独立变化的维度,而这两个或多个维度都需要独立进行扩展
不希望使用继承,或因为多层继承导致系统类的个数剧增
桥接模式的一个常用场景就是为了替换继承。我们知道继承有很多优点,比如抽象,封装,多态等,父类封装共性,子类实现特性。继承可以很好地帮助我们实现代码复用(封装)的功能,但是同时,这也是继承的一大缺点。因为父类拥有的方法,子类也会继承得到,无论子类是否需要。这说明了继承具备强侵入性(父类代码侵入子类),同时会导致子类臃肿。因此,在设计模式中,有一个原则为,优先使用组合/聚合的方式,而不是继承。

三、桥接模式的角色组成 


        抽象(Abstraction):

该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现,抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象);

        修正抽象(RefinedAbstraction):

Abstraction的具体实现,对Abstraction的方法进行完善和扩展;

        实现(Implementor):

确定实现维度的基本操作,提供给Abstraction使用。该类一般为接口或者抽象类;
具体实现(ConcreteImplementor): Implementor的具体实现;

四.案例

  需求:手机(型号 + 品牌)操作问题;

  ​    完成手机各品牌各型号的项目设计;

  ​    列如:折叠式的华为、小米、Vivo,直立式的华为、小米、Vivo,旋转式的、滑盖的...

  ​    要求该项目设计易于扩展

五.代码实现

package com.chaiyang.demo.demo2;

/**
 * 手机型号
 */
public abstract class Abstraction {
    protected Implementor implementor;

    public abstract void call();
}

class Folded extends Abstraction {
    private String name = "折叠式";

    Folded(Implementor implementor) {
        this.implementor = implementor;
    }

    @Override
    public void call() {
        System.out.println(this.implementor.getName() + this.name + "正在通话中");
    }
}

class Upright extends Abstraction {
    private String name = "直立式";

    Upright(Implementor implementor) {
        this.implementor = implementor;
    }

    @Override
    public void call() {
        System.out.println(this.implementor.getName() + this.name + "正在通话中");
    }
}

class Slide extends Abstraction {
    private String name = "滑盖式";

    Slide(Implementor implementor) {
        this.implementor = implementor;
    }

    @Override
    public void call() {
        System.out.println(this.implementor.getName() + this.name + "正在通话中");
    }
}
package com.chaiyang.demo.demo2;

/**
 * 手机品牌
 */
public interface Implementor {
    String getName();
}

class HW implements Implementor{
    private String name = "华为";

    @Override
    public String getName() {
        return name;
    }
}

class Mi implements Implementor{
    private String name = "小米";

    @Override
    public String getName() {
        return name;
    }
}

class Vivo implements Implementor{
    private String name = "Vivo";

    @Override
    public String getName() {
        return name;
    }
}
package com.chaiyang.demo.demo2;

public class Client {
    public static void main(String[] args) {
        Folded folded = new Folded(new HW());
        folded.call();

        Upright upright = new Upright(new Mi());
        upright.call();

        Slide slide = new Slide(new Vivo());
        slide.call();
    }
}

        运行效果图:

 

        从结果可以看出来:

​ 使用桥接模式,对该项目进行设计,型号或品牌的扩展,都不会影响另一方; 即手机型号扩展,手机品牌不受影响;手机品牌的上市退市,不会影响到手机型号;

注意: 1、桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程 2、桥接模式要求正确识别出系统中两个独立变化的维度(抽象、和实现),因此其使用范围有一定的局限性,即需要有这样的应用场景。

六、桥接模式优缺点

  • 优点
    • 分离抽象部分及具体实现部分
    • 提高了系统的扩展性
    • 符合开闭原则、合成复用原则
  • 缺点
    • 增加了系统的理解与设计难度
    • 需要正确地识别系统中两个独立变化的维度

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值