桥梁模式(Bridge Pattern) – 设计模式之结构型模式:
目录
桥梁实现类:ShapeColorBridgeDirector
桥梁模式(Bridge Pattern)
定义:
Decouple an abstraction from its implementation so that the two can vary independently.
将抽象部分与它的实现部分分离,使它们都可以独立变化。(实现指的是抽象类和它的派生类用来实现自己的对象)
类图
桥接模式通用的类图
桥接模式的主要作用就是通过将抽象部分与实现部分分离,把多种可匹配的使用进行组合。其核心实现也就是在A类中含有B类接口,通过构造函数传递B类的实现,这个B类就是设计的桥。
例子1:
过程:
由抽象工厂模式,获取到了形状和颜色的生成,如果组合使用的话,要如何操作的呢?
需求: 给不同的形状画颜色
类图:
颜色:
颜色类:Color
public interface Color {
public void fill();
}
蓝色:Blue
public class Blue implements Color {
@Override
public void fill() {
System.out.println(" 填充蓝色 blue color");
}
}
橘色: Orange
public class Orange implements Color {
@Override
public void fill() {
System.out.println(" 填充橘色 red color");
}
}
粉红色: Pink
public class Pink implements Color {
@Override
public void fill() {
System.out.println(" 填充粉红色 pink color");
}
}
形状
形状类:
public abstract class Shape {
public void setColor(Color color) {
this.color = color;
}
protected Color color;
public abstract void draw();
}
圆形:Circle
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("形状是圆形的: ○○○○○");
color.fill();
}
}
矩形:Rectangle
public class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("形状是矩形的:□□□□□ ");
color.fill();
}
}
三角形:Triangle
public class Triangle extends Shape {
@Override
public void draw() {
System.out.println("形状是三角形的: △△△△△");
color.fill();
}
}
测试:
public class ShapeColorBridgeTest {
public static void main(String[] arg) {
Color blue = new Blue();
Color orange = new Orange();
Color pink = new Pink();
Shape circle = new Circle();
circle.setColor(blue);
circle.draw();
Shape rectangle = new Rectangle();
rectangle.setColor(orange);
rectangle.draw();
Shape triangle = new Triangle();
triangle.setColor(pink);
triangle.draw();
}
}
结果:
形状是圆形的: ○○○○○
填充蓝色 blue color
形状是矩形的:□□□□□
填充橘色 red color
形状是三角形的: △△△△△
填充粉红色 pink color
优化例子1
合成/聚合复用原则(CARP):
尽量使用合成/聚合,尽量不要使用类继承。 优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样累和类继承层次会保持较小规模,并且不大可能增长为不可控制的庞然大物。
由CARP原则,可以看出例子1中形状类使用类继承,增加了其中的耦合度。因此做一个分离。使用一个桥梁类去合成两个的使用。颜色接口不变,调整形状的内容。
类图:
形状
形状接口:Shape
public interface Shape {
void draw();
}
圆形:Circle
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("形状是圆形的: ○○○○○");
}
}
矩形:Rectangle
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("形状是矩形的:□□□□□ ");
}
}
三角形:Triangle
public class Triangle implements Shape {
@Override
public void draw() {
System.out.println("形状是三角形的: △△△△△");
}
}
桥梁
桥梁类:Rectangle
public abstract class ShapeColorBridge {
protected Color color;
protected Shape shape;
public void changeColor(Color color) {
this.color = color;
}
public void changeShape(Shape shape) {
this.shape = shape;
}
public abstract void draw();
}
桥梁实现类:ShapeColorBridgeDirector
public class ShapeColorBridgeDirector extends ShapeColorBridge {
@Override
public void draw() {
shape.draw();
color.fill();
}
}
测试:
public class ShapeColorBridgeTest {
public static void main(String[] arg) {
Color blue = new Blue();
Color orange = new Orange();
Color pink = new Pink();
Shape circle = new Circle();
Shape rectangle = new Rectangle();
Shape triangle = new Triangle();
ShapeColorBridge shapeColorBridge = new ShapeColorBridgeDirector();
shapeColorBridge.changeColor(blue);
shapeColorBridge.changeShape(rectangle);
shapeColorBridge.draw();
shapeColorBridge.changeColor(orange);
shapeColorBridge.draw();
shapeColorBridge.changeColor(pink);
shapeColorBridge.draw();
shapeColorBridge.changeShape(circle);
shapeColorBridge.draw();
}
}
结果:
形状是矩形的:□□□□□
添加蓝色 blue color
形状是矩形的:□□□□□
添加红色 red color
形状是矩形的:□□□□□
添加粉红色 pink color
形状是圆形的: ○○○○○
添加粉红色 pink color
总结:
使用桥接模式,主要注意CRRP原则,减少类之间的耦合度。
优点:
1、抽象和实现的分离。
2、优秀的扩展能力。
3、实现细节对客户透明。
缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。