设计模式(十二)桥模式(Bridge)-结构型

桥模式Bridge引文

根据面向对象的设计原则,应该尽量使用组合而不是继承。桥模式将抽象与其实现解耦,使他们可以分别独立地变化,是继承的一种代替方式。

对于两个类之间需要进行关联时,不要直接在一个类的代码中调用另一个类的代码,而是要通过这些设计模式,在两个类之间建立一个类似的缓冲器的类,从而将直接关联的两个类进行解耦,以保证以后当一个类的接口发生变化时不会影响另一个类的使用。

实现原理图

桥模式实现原理图

桥模式试讲抽象和实现分离实现解耦,使他们可以分别独立地变化桥模式也是继承关系的一个替代方案。桥模式一共由四部分组成:抽象类抽象类的继承类实现类实现类的继承类

实现代码

实现类接口的示意代码如下:

public interface Implement {
    void operation1();
}

抽象类的示意代码如下:

public abstract class Interface {
    Implement impl;
    public Interface(Implement impl){
        this.impl = impl;
    }
    public void operation1(){
        this.impl.operation1();
    }
}

抽象类的继承类的示意代码如下:

public class Interface1 implements Interface {
    public Interface1(Implement impl){
        super(impl);
    }
    public void operation1(){
        impl.operation1();
    }
}

抽象类的另一个继承类

public class Interface2 implements Interface {
    public Interface2(Implement impl){
        super(impl);
    }
    public void operation1(){
        impl.operation1();
    }
}

实现类的继承类的示意代码如下:

public class Implement1 implements Implement {
    public void operation1(){
    }
}

实现类的另一个继承类的示意代码如下:

public class Implement1 implements Implement {
    public void operation1(){
    }
}

现实应用

销售电脑案例

电脑可分为:台式、笔记本、平板电脑;

还可以分为不同的品牌:戴尔、苹果、联想等;

如何设计类才算合理?

桥梁模式的优点

  • 抽象和实现分离

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

  • 优秀的扩展能力
  • 实现细节对客户透明

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

桥梁模式的使用场景

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

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

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

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

  • 重用性要求较高的场景

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

桥梁模式的注意事项

  • 使用桥梁模式时主要考虑如何拆分抽象和实现,并不是一涉及继承就要考虑使用该模式,那还要继承干什么。
  • 桥梁模式的意图还是对变化的封装,尽量把可能变化的因素封装到最细、最小的逻辑单元中,避免风险扩散。
  • 系统设计时,发现类的继承有N层时,可以考虑使用桥梁模式。
时间: 2024-10-07 16:46:35

设计模式(十二)桥模式(Bridge)-结构型的相关文章

设计模式-12 享元模式(结构型模式)

一 享元模式 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建. 关键代码:存储相似的对象 使用场景: 1.系统有大量相似对象. 2.需要缓冲池的场景. 类图 : 二 实现代码 Java里面的JDBC连接池,适用于作共享的一些个对象,他们有一些共有的属性,就拿数据库连接 池来说,url.driv

设计模式-11 外观模式(结构型模式)

一  外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口. 关键代码:在客户端和复杂系统之间再加一层,这一次将调用顺序.依赖关系等处理好. 使用场景: JAVA 的三层开发模式 1.为复杂的模块或子系统提供外界访问的模块. 2.子系统相对独立. 3.预防低水平人员带来的风险. 类图

C#设计模式之十二代理模式(Proxy Pattern)【结构型】

原文:C#设计模式之十二代理模式(Proxy Pattern)[结构型] 一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看."代理"可以理解为"代替",代替"主人"做一些事情,为什么需要"代理",是因为某些原因(比如:安全方面的原因),不想让"主人"直接

设计模式07: Bridge 桥接模式(结构型模式)

Bridge 桥接模式(结构型模式) 抽象与实现 抽象不应该依赖于实现细节,实现细节应该依赖于抽象. 抽象B稳定,实现细节b变化 问题在于如果抽象B由于固有的原因,本身并不稳定,也有可能变化,怎么办? 举例来说 假如我们需要开发一个同时支持PC和手机的坦克游戏,游戏在PC和手机上功能都一样,都有同样的类型,面临同样的需求变化,比如坦克可能有多种不同的型号:T50,T75,T90…… 对于其中坦克设计,我们可能很容易设计出来一个Tank的抽象基类: /// <summary> /// 抽象Tan

(转)Java经典设计模式(2):七大结构型模式(附实例和详解)

原文出处: 小宝鸽 总体来说设计模式分为三大类:创建型模式.结构型模式和行为型模式. 博主的上一篇文章已经提到过创建型模式,此外该文章还有设计模式概况和设计模式的六大原则.设计模式的六大原则是设计模式的核心思想,详情请看博主的另外一篇文章:Java经典设计模式之五大创建模式(附实例和详解). 接下来我们看看结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式.其中适配器模式主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.其中的对象的适配器

设计模式08: Composite 组合模式(结构型模式)

Composite 组合模式(结构型模式) 对象容器的问题在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即他们在充当对象的同时,又是其他对象的容器. public interface IBox { void Process(); } public class SingleBox:IBox { public void Process(){...} } public class ContainerBox:IBox { public void Process(){...} public

设计模式12: Proxy 代理模式(结构型模式)

Proxy 代理模式(结构型模式) 直接与间接 人们对于复杂的软件系统常常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活.满足特定需求的解决方案.如下图,开始时,A需要和B进行3次通信,当增加一个C后,C和B只需要通信一次,A和C通信3次就好了. 动机(Motivation) 在面向对象系统中某些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全机制,或者需要进程外的访问等),直接访问会给使用者.或者系统结构带来很多麻烦. 如果在不失去透明操作对象的同时来管理.控制这些

设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就推卸给另外个一个部门(对象).至于究竟谁来解决问题呢?政府部门就是为了能够避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,而且沿着这条链传递请求.直到有(部门)对象处理它为止. 样例1:js的事件浮升机制 样例2: 2.问题 假设有多个对象都有

设计模式11: Flyweight 享元模式(结构型模式)

Flyweight 享元模式(结构型模式) 面向对象的代价 面向对象很好的解决了系统抽象性的问题,同时在大多数情况下也不会损及系统的性能.但是,在某些特殊应用中,由于对象的数量太大,采用面向对象会给系统带来难以承受的内存开销.比如图形应用中的图元等对象.字处理应用中的字符对象等. 动机(Motivation) 采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,而带来很高的运行代价——主要指内存需求方面的代价. 如何避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.