参考文档
https://www.cnblogs.com/WindSun/p/10260547.html
http://c.biancheng.net/view/1364.html
模式动机
设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:
• 第一种设计方案是为每一种形状都提供一套各种颜色的版本。
• 第二种设计方案是根据实际需要对形状和颜色进行组合。
对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。
桥接模式的定义与特点
桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
桥接(Bridge)模式的优点是:
- 由于抽象与实现分离,所以扩展能力强;
- 其实现细节对客户透明。
缺点是:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。
桥接模式的结构与实现
可以将抽象化部分与实现化部分分开,取消二者的继承关系,改用组合关系。
1. 模式的结构
桥接(Bridge)模式包含以下主要角色。
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
demo
抽象化角色Shape 、抽象化扩展 Circle,Square;
实现化 Color、具体实现化 WhiteColor,BlueColor。
step 1 抽象化角色Shape 、抽象化扩展 Circle,Square.
抽象化角色Shape
package java_basic.stu_design_mode.stu_bridge;
public abstract class Shape {
abstract double calculatePerimeter(int a);
private Color color;
public abstract void handleColor(Color color);
}
抽象化扩展 Circle
package java_basic.stu_design_mode.stu_bridge;
public class Circle extends Shape {
String mark="圆形";
@Override
public double calculatePerimeter(int a) {
return Math.PI*2*a;
}
@Override
public void handleColor(Color color) {
System.out.println("这是圆形的颜色");
color.showColor();
}
public void handleRectangle(){
System.out.println("这是圆形特有的动作--->"+mark);
}
}
抽象化扩展Square
package java_basic.stu_design_mode.stu_bridge;
public class Square extends Shape {
private Color color;
@Override
public double calculatePerimeter(int a) {
return a*4;
}
@Override
public void handleColor(Color color) {
System.out.println("这是方形颜色");
color.showColor();
}
}
step2 实现化 Color、具体实现化 WhiteColor,BlueColor。
实现化 Color接口
package java_basic.stu_design_mode.stu_bridge;
public interface Color {
void showColor();
}
具体实现化 WhiteColor
package java_basic.stu_design_mode.stu_bridge;
public class WhiteColor implements Color {
@Override
public void showColor() {
System.out.println("这是白色");
}
public void canDor(){
System.out.println("白色的颜色可以使人感到纯净,光鲜");
}
}
具体实现化 BlueColor
package java_basic.stu_design_mode.stu_bridge;
public class BlueColor implements Color {
@Override
public void showColor() {
System.out.println("这是蓝色");
}
}
step3 调用
package java_basic.stu_design_mode.stu_bridge;
import org.junit.Test;
public class Main {
@Test
public void method() {
Color blueColor = new BlueColor();
Color whiteColor = new WhiteColor();
Shape square = new Square();
square.handleColor(blueColor);
square.handleColor(whiteColor);
Shape circle = new Circle();
circle.handleColor(blueColor);
circle.handleColor(whiteColor);
}
}
运行结果
这是方形颜色
这是蓝色
这是方形颜色
这是白色
这是圆形的颜色
这是蓝色
这是圆形的颜色
这是白色