桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象与实现解耦,使得两者可以独立变化。桥接模式通常适用于以下情形:
- 类的功能可以在不同的维度上变化,例如在图形界面开发中,可能有不同的形状和不同的颜色,你可以在这两者之间进行独立变化。
- 类的实现不应该直接依赖于具体实现,而是通过接口和抽象类进行解耦。
桥接模式的结构
- Abstraction(抽象类):定义了一个接口,并且持有一个实现对象的引用。
- RefinedAbstraction(扩展抽象类):是对Abstraction的具体化,实现了不同的业务方法。
- Implementor(实现接口):定义了所有具体实现类必须实现的接口。
- ConcreteImplementor(具体实现类):实现了Implementor接口的具体类。
示例:绘图应用程序(形状与颜色分离)
我们可以创建一个图形应用程序,其中有不同的形状(如圆形和方形)和不同的颜色(如红色、绿色)。我们希望能够独立地扩展形状和颜色的种类,而不需要修改现有的代码。
1. 定义实现接口(IColor
)
cs
public interface IColor
{
void Paint();
}
2. 实现具体颜色类(Red
和 Green
)
cs
public class Red : IColor
{
public void Paint()
{
Console.WriteLine("Painting in Red");
}
}
public class Green : IColor
{
public void Paint()
{
Console.WriteLine("Painting in Green");
}
}
3. 定义抽象类(Shape
)
cs
public abstract class Shape
{
protected IColor color;
public Shape(IColor color)
{
this.color = color;
}
public abstract void Draw();
}
4. 扩展具体形状(Circle
和 Square
)
cs
public class Circle : Shape
{
public Circle(IColor color) : base(color) { }
public override void Draw()
{
Console.Write("Drawing Circle, ");
color.Paint();
}
}
public class Square : Shape
{
public Square(IColor color) : base(color) { }
public override void Draw()
{
Console.Write("Drawing Square, ");
color.Paint();
}
}
5. 客户端使用
cs
class Program
{
static void Main(string[] args)
{
IColor red = new Red();
IColor green = new Green();
Shape circle = new Circle(red); // 圆形,红色
Shape square = new Square(green); // 方形,绿色
circle.Draw(); // Drawing Circle, Painting in Red
square.Draw(); // Drawing Square, Painting in Green
}
}
运行结果
cs
Drawing Circle, Painting in Red
Drawing Square, Painting in Green
分析
IColor
是实现接口,定义了颜色的抽象行为。Red
和Green
是具体的实现类,分别实现了不同颜色的绘制行为。Shape
是抽象类,定义了形状的行为,依赖于IColor
接口。Circle
和Square
是具体的形状类,通过构造函数接受颜色的实现对象,从而实现不同形状与颜色的组合。
总结
-
优点:
- 可以独立地扩展形状和颜色类,而不需要修改现有代码。
- 减少了子类的数目,避免了复杂的类继承结构。
- 使得系统能够更灵活地扩展新功能。
-
缺点:
- 增加了系统的抽象性,学习和理解曲线较为陡峭。
- 对于非常简单的系统,可能引入不必要的复杂性。
桥接模式非常适合用在那些需要避免多重继承和扩展时,尤其是当系统的某个部分(如形状或颜色)频繁变化时。