Java设计模式—桥梁模式

(尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/52490611冷血之心的博客)

目录

桥梁模式(桥接模式)

定义:

通用类图如下:

角色介绍:

● Abstraction——抽象化角色

● Implementor——实现化角色

● Refined Abstraction——修正抽象化角色

● Concrete Implementor——具体实现化角色

通用源代码:

测试类:

桥梁模式的优点:

● 抽象和实现分离

● 优秀的扩充能力

● 实现细节对客户透明

使用场景:

● 不希望或不适用使用继承的场景

● 接口或抽象类不稳定的场景

● 重用性要求较高的场景

总结:


桥梁模式(桥接模式)

定义:

将抽象和实现解耦,使得两者可以独立地变化。

        桥梁模式是为了解决类继承的缺点而设计的。一个类想拥有另一个类的方法,可以不继承,只需要铺设一个桥梁(引用)架过去就OK了。

通用类图如下:

角色介绍:

● Abstraction——抽象化角色

它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。

● Implementor——实现化角色

它是接口或者抽象类,定义角色必需的行为和属性。

● Refined Abstraction——修正抽象化角色

它引用实现化角色对抽象化角色进行修正。

● Concrete Implementor——具体实现化角色

它实现接口或抽象类定义的方法和属性。

通用源代码:

//实现化角色
public interface Implementor {
     //基本方法
     public void doSomething();
     public void doAnything();
}

它没有任何特殊的地方,就是一个一般的接口,定义要实现的方法。

//具体实现化角色
public class ConcreteImplementor1 implements Implementor{
     public void doSomething(){
             //业务逻辑处理
     }
     public void doAnything(){
             //业务逻辑处理
     }
}
public class ConcreteImplementor2 implements Implementor{
     public void do Something(){
             //业务逻辑处理
}
     public void do Anything(){
             //业务逻辑处理
     }
}

上面定义了两个具体实现化角色代表两个不同的业务逻辑。

抽象化角色
public abstract class Abstraction {
     //定义对实现化角色的引用
     private Implementor imp;
     //约束子类必须实现该构造函数
     public Abstraction(Implementor _imp){
             this.imp = _imp;
     }
     //自身的行为和属性
     public void request(){
             this.imp.doSomething();
     }
     //获得实现化角色
     public Implementor getImp(){
             return imp;
     }
}

         为什么要增加一个构造函数?答案是为了提醒子类,你必须做这项工作,指定实现者,特别是已经明确了实现者,则尽量清晰明确地定义出来。

具体抽象化角色
public class RefinedAbstraction extends Abstraction {
     //覆写构造函数
     public RefinedAbstraction(Implementor _imp){
             super(_imp);
     }
     //修正父类的行为
     @Override
     public void request(){
             /*
              * 业务处理...
              */
             super.request();
             super.getImp().doAnything();
     }
}

测试类:

public class Client {
     public static void main(String[] args) {
             //定义一个实现化角色
             Implementor imp = new ConcreteImplementor1();
             //定义一个抽象化角色
             Abstraction abs = new RefinedAbstraction(imp);
             //执行行文
             abs.request();
     }
}

        桥梁模式是一个非常简单的模式,它只是使用了类间的聚合关系、继承、覆写等常用功能,但是它却提供了一个非常清晰、稳定的架构。

       各位请仔细瞅瞅桥梁模式,就是ConcreteImplementor1类有两个方法:dosomething( )和doanything( )。然后有一个类RefinedAbstraction就也想拥有这两方法,但是又不想实现继承关系,所以利用了一个桥梁(引用)就OK了。

桥梁模式的优点:

● 抽象和实现分离

        这也是桥梁模式的主要特点,它完全是为了解决继承的缺点而提出的设计模式。在该模式下,实现可以不受抽象的约束,不用再绑定在一个固定的抽象层次上。

● 优秀的扩充能力

        看看我们的例子,想增加实现?没问题!想增加抽象,也没有问题!只要对外暴露的接口层允许这样的变化,我们已经把变化的可能性减到最小。

● 实现细节对客户透明

       客户不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装。

使用场景:

● 不希望或不适用使用继承的场景

      例如继承层次过渡、无法更细化设计颗粒等场景,需要考虑使用桥梁模式。

● 接口或抽象类不稳定的场景

     明知道接口不稳定还想通过实现或继承来实现业务需求,那是得不偿失的,也是比较失败的做法。

● 重用性要求较高的场景

    设计的颗粒度越细,则被重用的可能性就越大,而采用继承则受父类的限制,不可能出现太细的颗粒度。

总结:

        继承非常好,但是有缺点(比如"强侵入"),我们可以扬长避短,对于比较明确不发生变化的,则通过继承来完成;若不能确定是否会发生变化的,那就认为是会发生变化,则通过桥梁模式来解决,这才是一个完美的世界。

 

如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,我会持续更新,如果有什么问题,可以进群366533258一起交流学习哦~

 

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温柔狠角色

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值