设计模式篇---桥接模式

文章目录

    • 概念
    • 结构
    • 实例
    • 总结

概念

桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
毛笔和蜡笔都属于画笔,假设需要有大、中、小三种型号的画笔,绘画出12种颜色,蜡笔需要3*12=36支,毛笔需要3支毛笔+12个颜色=15个对象。当扩展一种型号的画笔时,蜡笔再需要12支,毛笔只需要一支。毛笔的这种思想的本质就是桥接模式。
颜色和型号是两个不同的变化维度,各自进行扩展理应该不影响另外一方,但蜡笔将颜色和型号糅合在了一起,这就产生了耦合,当一方发生扩展时势必要引起另一方的变动。

结构

桥接模式的结构图如下:

Abstraction(抽象类):用于定义抽象类的接口,其中定义了一个Implementor类型的对象。Abstraction中可以使用Implementor中的方法,通过关联的方式,而不是继承。该接口即可以包含抽象业务方法也可以包含具体业务方法;它可以理解为是毛笔。
RefinedAbstraction(扩充抽象类):它是Abstraction的实现。
Implementor(实现类接口):该接口提供一些基本的操作,并将这些基本的实现让子类来完成;它可以理解为是颜色。
ConcreteImplementor(具体实现类):它具体实现了Implementor接口,在不同的ConcreteImplementor中有不同的实现操作。

实例

现在以毛笔为例,实现它的demo
设计模式篇---桥接模式_第1张图片
毛笔的抽象类

public abstract class Quill {

    protected Color color;

    protected Quill (Color color) {
        this.color = color;
    }

    public abstract void draw(Color color);
    
}

颜色的抽象类,与毛笔的抽象类是桥接关系。

public abstract class Color {

    abstract void color();
}

大号毛笔

public class BigQuill extends Quill {
    public BigQuill(Color color) {
        super(color);
    }

    @Override
    public void draw(Color color) {
        System.out.println("大号毛笔");
        color.color();
    }
}

中号毛笔

public class MediumQuill extends Quill {
    public MediumQuill(Color color) {
        super(color);
    }

    @Override
    public void draw(Color color) {
        System.out.println("中号毛笔");
        color.color();
    }
}

小号毛笔

public class SmallQuill extends Quill  {
    public SmallQuill(Color color) {
        super(color);
    }

    @Override
    public void draw(Color color) {
        System.out.println("小号毛笔");
        color.color();
    }
}

红色

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

绿色

public class GreenColor extends Color{
    @Override
    void color() {
        System.out.println("绿色");
    }
}

黑色

public class BlackColor extends Color{
    @Override
    void color() {
        System.out.println("黑色");
    }
}

客户端

public class Client {

    public static void main(String[] args) {
        Color redColor = new RedColor();
        Quill bigQuill = new BigQuill(redColor);
        bigQuill.draw(redColor);
    }
}

总结

在使用桥接模式时应该识别出一个类具有两个独立的变化维度,就比如毛笔本身具有一个维度,需要画出颜色就需要另外一个维度–颜色,颜色本身并不属于毛笔中的属性,它和毛笔本身是一个“设置”关系,所以它也可以作为一个抽象类,和毛笔进行桥接。
桥接模式使用的场景:
1、如果一个系统需要在抽象化和具体化之间增加更多的灵活性,可以考虑通过桥接模式使它们建立一个抽象的管理关系。
2、抽象部分和被“设置”部分可以通过继承的方式独立扩展而不相互影响。
3、一个类存在多个独立的变化维度,而这些维度需要独立的进行扩展。
4、不希望因为使用继承或多重继承而导致类的个数急剧增加的系统。

你可能感兴趣的:(设计模式,桥接模式,java)