设计模式之—桥接模式

2022-07-27,,

一、简介桥接

桥接模式属于结构型模式,其采用将抽象部分与它的实现部分分离的方式,使它们只有独立的变化,从而达到解耦的目的。

桥接模式UML图

二、桥接模式实例

1. 实例的描述

以笔为例,现在需要大、中、小的笔,每种笔必须有三种颜色。那么根据乘法原理就需要3x3=9支笔。
现在需要增加一种黑颜色的笔,那么总共需要3x4=12支比。那如果增加到十几种颜色,然后此时要增加一种偏大,或者偏小的笔,那么要增加的数量就是非常恐怖的。

那么怎么解决这种问题呢,答案是有的,那就是使用颜料。比如刚才3x3的情况下,要增加黑色,只需要添加一种颜料即可。即使在有十几种颜色的情况下,要增加一种偏大,或者偏小的笔。直接多加两枝笔就可以满足需求。

在上面的例子中,改造的关键就是颜料。颜料将笔的两个属性——大小和颜色分离开,使它们可以独立的变化,使乘法转换成加法,增减颜色时不会影响到笔数量的变化,反之亦然。这就是所谓的解耦

2. 实例的实现

2.1 实例的UML图

2.2 实例的Java实现

Color接口

package bridge.color;

public interface Color {
    public String color();
}

Red 类

package bridge.color.impl;

import bridge.color.Color;

public class Red implements Color {
    @Override
    public String color() {
        return "Red";
    }
}

Green 类

package bridge.color.impl;

import bridge.color.Color;

public class Green implements Color {
    @Override
    public String color() {
        return "Green";
    }
}

Blue 类

package bridge.color.impl;

import bridge.color.Color;

public class Blue implements Color {
    @Override
    public String color() {
        return "Blue";
    }
}

Pen 抽象类

package bridge.pen;

import bridge.color.Color;

public abstract class Pen {
  private Color color;
  public void setColor(Color color) {
    this.color = color;
  }

  public Color getColor() {
    return color;
  }

  public abstract void draw(String name);
}

BigPen 类

package bridge.pen.impl;

import bridge.pen.Pen;

public class BigPen extends Pen {
    @Override
    public void draw(String name) {
        System.out.println(name + " draw by " + this.getClass().getSimpleName()+ " with " + this.getColor().color());
    }
}

MiddlePen 类

package bridge.pen.impl;

import bridge.pen.Pen;

public class MiddlePen extends Pen {
    @Override
    public void draw(String name) {
        System.out.println(name + " draw by " + this.getClass().getSimpleName()+ " with " + this.getColor().color());
    }
}

SmallPen 类

package bridge.pen.impl;

import bridge.pen.Pen;

public class SmallPen extends Pen {
    @Override
    public void draw(String name) {
        System.out.println(name + " draw by " + this.getClass().getSimpleName()+ " with " + this.getColor().color());
    }
}

Client 类

package bridge;

import bridge.color.impl.Blue;
import bridge.color.impl.Green;
import bridge.color.impl.Red;
import bridge.pen.Pen;
import bridge.pen.impl.BigPen;
import bridge.pen.impl.MiddlePen;
import bridge.pen.impl.SmallPen;

public class Client {
    public static void main(String[] args) {
        Pen bigPen = new BigPen();
        bigPen.setColor(new Red());
        bigPen.draw("flower");

        Pen smallPen = new SmallPen();
        bigPen.setColor(new Green());
        bigPen.draw("flower");

        Pen middlePen = new MiddlePen();
        bigPen.setColor(new Blue());
        bigPen.draw("flower");
    }
}

运行结果

2.3 实例的扩展

假设当前需要加入黑色,那么只需增加一个类。

Block 类

package bridge.color.impl;

import bridge.color.Color;

public class Black implements Color {
    @Override
    public String color() {
        return "Black";
    }
}

Client 类

在Client中添加新增颜色的测试代码。

package bridge;

import bridge.color.impl.Black;
import bridge.color.impl.Blue;
import bridge.color.impl.Green;
import bridge.color.impl.Red;
import bridge.pen.Pen;
import bridge.pen.impl.BigPen;
import bridge.pen.impl.MiddlePen;
import bridge.pen.impl.SmallPen;

public class Client {
    public static void main(String[] args) {
        Pen bigPen = new BigPen();
        bigPen.setColor(new Red());
        bigPen.draw("flower");

        Pen smallPen = new SmallPen();
        bigPen.setColor(new Green());
        bigPen.draw("flower");

        Pen middlePen = new MiddlePen();
        bigPen.setColor(new Blue());
        bigPen.draw("flower");

        System.out.println("----------------分割线----------------");

        // 新加入一种颜色测试
        Pen bigPen1 = new BigPen();
        Pen middlePen1 = new MiddlePen();
        Pen smallPen1 = new SmallPen();

        bigPen1.setColor(new Black());
        middlePen1.setColor(new Black());
        smallPen1.setColor(new Black());

        bigPen1.draw("flower");
        middlePen1.draw("flower");
        smallPen1.draw("flower");
    }
}

运行结果

经过测试增加颜色时,仅需增加一个类而无需修改其它任何代码。在Client增加Black颜色的测试,结果显示我们想要的结果达到了。

本文地址:https://blog.csdn.net/weixin_44832837/article/details/110281323

《设计模式之—桥接模式.doc》

下载本文的Word格式文档,以方便收藏与打印。