设计模式之—桥接模式
一、简介桥接
桥接模式属于结构型模式,其采用将抽象部分与它的实现部分分离的方式,使它们只有独立的变化,从而达到解耦的目的。
桥接模式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
上一篇: 阿里P8亲荐“架构师修炼宝典”教你如何成为出色的架构师?
下一篇: 设计模式-JDK工厂模式