欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式之—桥接模式

程序员文章站 2022-03-03 09:45:53
一、简介桥接桥接模式属于结构型模式,其采用将抽象部分与它的实现部分分离的方式,使它们只有独立的变化,从而达到解耦的目的。桥接模式UML图二、桥接模式实例1. 实例的描述以笔为例,现在需要大、中、小的笔,每种笔必须有三种颜色。那么根据乘法原理就需要3x3=9支笔。现在需要增加一种黑颜色的笔,那么总共需要3x4=12支比。那如果增加到十几种颜色,然后此时要增加一种偏大,或者偏小的笔,那么要增加的数量就是非常恐怖的。那么怎么解决这种问题呢,答案是有的,那就是使用颜料。比如刚才3x3的情况下,要...

一、简介桥接

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

桥接模式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