设计模式-桥梁模式

作者: breezedancer | 来源:发表于2016-11-05 16:01 被阅读724次

桥梁模式是为了解决将抽象部分与实现部分分离,好让他们都在自己的维度上有多维度地变化。

为了充分理解上面的含义,举个例子来说明,假如市面上电视和遥控器来自不同产家,遥控器要实现针对每个不同的电视需要不同的遥控器,那么我们可能看到如下的结果

每个具体的遥控器都去继承或是实现遥控器的抽象或是接口,并且在每个具体的遥控器内部都聚合了各自的电视机接口。这种方案可以解决问题,可以解决遥控器与电视机的对应关系。可是,却有一个问题,就像上面场景中所说的,如果这里的有一些新的电视机出现,那么生产遥控器的产商还得去生产新的遥控器。这样一来各自的遥控器数量不但不好把握,而且这样的设计很繁杂

下面开始桥梁模式,首先看下 UML 类图


  • Abstraction(抽象类):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以维护该对象,它与Implementor之间具有关联关系,它既可以包含抽象业务方法,也可以包含具体业务方法。

  • RefinedAbstraction(扩充抽象类):扩充由Abstraction定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在Abstraction中声明的抽象业务方法,在RefinedAbstraction中可以调用在Implementor中定义的业务方法。

  • Implementor(实现类接口):定义实现类的接口,这个接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同,一般而言,Implementor接口仅提供基本操作,而Abstraction定义的接口可能会做更多更复杂的操作。Implementor接口对这些基本操作进行了声明,而具体实现交给其子类。通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调用到Implementor中定义的方法,使用关联关系来替代继承关系。

  • ConcreteImplementor(具体实现类):具体实现Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同实现,在程序运行时,ConcreteImplementor对象将替换其父类对象,提供给抽象类具体的业务操作方法。

再举个例子来看,比如画笔有类型不同,颜色不同;那么类型中也有可能新增,颜色也有可能新增,如何设计这个情况


如果需要增加一种新型号的毛笔,只需扩展左侧的“抽象部分”,增加一个新的扩充抽象类;如果需要增加一种新的颜色,只需扩展右侧的“实现部分”,增加一个新的具体实现类。扩展非常方便,无须修改已有代码,且不会导致类的数目增长过快。

代码过一遍,首先把毛笔抽象类写出

public abstract class Maobi {

    protected MyColor color;
    
    public void setColor(MyColor color){
        this.color=color;
    }
    
    public abstract void paint();
}

把具体的两个毛笔实现类

public class BigMaobi extends Maobi{

    @Override
    public void paint() {
        //着色
        System.out.println("这个是大毛笔!");
        color.color();
        
    }

}

public class SmallMaobi extends Maobi{

    @Override
    public void paint() {
        System.out.println("这个是小毛笔");
        color.color();
    }

}

抽象部分,颜色的接口

public abstract class MyColor {

    public abstract void color();
}

颜色接口的 具体实现


public class RedColor extends MyColor{

    @Override
    public void color() {
        System.out.println("红色");
        
    }

}


public class GreenColor extends MyColor{

    @Override
    public void color() {
        System.out.println("这个是绿色");
    }

}

最后构建客户端运行下


public class Client {

    public static void main(String[] args) {
        Maobi mb=new BigMaobi();
        MyColor color=new RedColor();
        mb.setColor(color);
        mb.paint();
    }
}

可以得出,需要改造笔的不同型号,继承 Maobi 类就可以,和颜色无关,颜色需要新增的话,就实现 MyColor,也与毛笔类型无关,这样在各自的维度自由飞翔。

相关文章

  • 3.桥梁模式 桥梁模式:桥梁模式是一个非常重要的模式,也是一个比较复杂的模式。熟悉这个模式对于理解面向对象的设计原...

  • 设计模式-桥梁模式

    桥梁模式是为了解决将抽象部分与实现部分分离,好让他们都在自己的维度上有多维度地变化。 为了充分理解上面的含义,举个...

  • 设计模式-桥接模式

    设计模式-桥接模式 定义 桥接模式(Bridge Pattern)也称为桥梁模式、接口(Interface)模式或...

  • 设计模式十--桥梁模式

    定义 将抽象和实现解耦,使得两者可以独立的变化 角色 1:抽象化角色(Abstraction)该角色抽象化给出的定...

  • 设计模式之桥梁模式

    桥梁模式的定义 桥梁模式(Bridge Pattern)也叫做桥接模式,是一个比较简单的模式,其定义如下: Dec...

  • 设计模式15:桥梁模式

    桥梁模式(Bridge DP)的定义是:解耦抽象与实现,让两者能够分别变化。桥梁模式的名字可能有一点费解,为什么是...

  • 设计模式(七):桥梁模式

    桥梁模式(Bridge) 将抽象与实现解耦,使它们都可以独立的变化。 主要解决: 桥梁模式完全是为了解决继承的缺点...

  • Android 桥接模式

    Android 23种设计模式 一、前言 Android桥接(Bridge)模式,又被称为桥梁模式。结构型模式之一...

  • 二十三种设计模式包括工厂模式、建造者模式、工厂方法模式、原始模型模式、单例模式、适配器模式、桥梁模式、合成模式、装...

  • 6、结构型模式-适配器设计模式

    1、接口之间的桥梁-适配器设计模式 简介:讲解Adapeter设计模式和应用场景 适配器模式(Adapter Pa...

网友评论

    本文标题:设计模式-桥梁模式

    本文链接:https://www.haomeiwen.com/subject/ljhguttx.html