在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。将颜色和形状两两结合的方式成为桥接。
桥接模式的结构与实现
可以将抽象化部分与实现化部分分开,取消二者的继承关系,改用组合关系。
1. 模式的结构
桥接(Bridge)模式包含以下主要角色。
抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
举例:我们画不同颜色的形状
//首先是形状类和颜色的抽象类
//该类为一个抽象类,主要提供画形状的方法
public abstract class Shape {
Color color;//形状里要有颜色的实例
public void setColor(Color color) {
this.color = color;
}
public abstract void draw();
}
//颜色类
public interface Color {
public void bepaint(String shape);
}
//------------------------------------------------
//具体形状的实现:圆形
public class Circle extends Shape{
public void draw() {
color.bepaint("圆形");
}
}
//具体形状的实现:长方形
public class Rectangle extends Shape{
public void draw() {
color.bepaint("长方形");
}
}
//具体形状的实现:正方形
public class Square extends Shape{
public void draw() {
color.bepaint("正方形");
}
}
//具体颜色的实现:黑色
public class Black implements Color{
public void bepaint(String shape) {
System.out.println("黑色的" + shape);
}
}
//具体颜色的实现:灰色
public class Gray implements Color{
public void bepaint(String shape) {
System.out.println("灰色的" + shape);
}
}
//具体颜色的实现:白色
public class White implements Color{
public void bepaint(String shape) {
System.out.println("白色的" + shape);
}
}
//测试
public static void main(String[] args) {
//白色
Color white = new White();
//正方形
Shape square = new Square();
//白色的正方形
square.setColor(white);
square.draw();
//长方形
Shape rectange = new Rectangle();
rectange.setColor(white);
rectange.draw();
}
运行结果