桥接模式
将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
(桥接模式是连接两个或多个不同维度的东西,而且这两个维度又经常变化。比如图形既可按形状
分,又可按颜色分。)
组成模块
实现类接口:定义实现接口,提供基本操作的接口。
具体实现类:实现实现接口的具体类。
抽象类:定义抽象类的接口,通常是抽象类,而不是接口,通常包含对实现接口的引用。
扩展抽象类:对抽象的扩展,可以是抽象类的子类或具体实现类。
上述可能还不能特别好理解桥接模式,下面举一个例子:
基于一个图形,我们现在想要一个正方形和一个圆形。同时还要给图形上色,颜色要红色和绿色。
这时我们可以创建四个类,红色的正方形、红色的圆形、绿色的正方形、绿色的圆形。那假如我还
要黄色,我们可以再增加两个类,黄色的正方形、黄色的圆形。那假如我们再要一个长方形,那就
要增加三个类,红色的正方形、绿色的长方形、黄色的长方形。
照这样下去,所有组合类的数量将以几何级数增长。。。。。
桥接模式主要解决的问题就是,新增一个颜色或者新增一个图形,跟另一个纬度没有关系,就是说
新增一个颜色,跟图形没有关系。新增一个图形,跟颜色没有关系。
Demo
1、定义接口
//支持的颜色
interface IColor
{
void SupportColor();
}
2、实现接口
// 支持红色
class RedColor : IColor
{
public void SupportColor()
{
Console.WriteLine("Support Red color");
}
}
// 支持绿色
class GreenColor : IColor
{
public void SupportColor()
{
Console.WriteLine("Support Green color");
}
}
3、定义抽象类
// 抽象部分:形状
abstract class Shape
{
protected IColor color;
public Shape(IColor color)
{
this.color = color;
}
//画形状抽象方法
public abstract void Draw();
}
4、扩展抽象类
// 具体抽象部分:圆形
public class Circle : Shape
{
public Circle(IColor color) : base(color) { }
public override void Draw()
{
Console.Write("Drawing Circle in ");
//后上色
color.ApplyColor();
}
}
// 具体抽象部分:正方形
public class Square : Shape
{
public Square(IColor color) : base(color) { }
public override void Draw()
{
//先上色
color.ApplyColor();
Console.Write("Drawing Square in ");
}
}
5、调用
IColor redColor = new RedColor();
IColor greenColor = new GreenColor();
Shape redCircle = new Circle(redColor);
Shape greenSquare = new Square(greenColor);
redCircle.Draw();
greenSquare.Draw();
Shape类其实扮演的角色就是桥接角色,它将图形与颜色关联起来。
现在假如说,图形要加上动态效果,例如闪烁、旋转等。
这时我们再定义一个接口,表示动态效果,并且有不同的实现,比如闪烁、旋转。
再将动态效果的接口放到Shape类中,这样就实现了一个事物,不同纬度之间的扩展,互不影响。
优点
1、解耦性:桥接模式通过将抽象部分和实现部分分离,使它们可以独立变化,从而降低了它们之
间的耦合性。这使得系统更加灵活,可以更容易地扩展和修改。
2、可扩展性:由于桥接模式将抽象部分和实现部分分离,可以在不修改现有代码的情况下轻松地
添加新的抽象部分或实现部分,从而实现系统的可扩展性。
缺点
1、增加复杂度:桥接模式引入了额外的抽象层,可能会增加系统的复杂度,特别是在设计较小规
模的系统时可能会显得过于繁琐。
2、抽象和实现的选择:在桥接模式中,需要正确地选择抽象部分和实现部分的组合,这需要一定
的经验和设计能力,不合适的选择可能会导致系统设计不佳。
适用场景
1、一个类存在多个独立变化的维度:当一个类存在多个独立变化的维度,并且希望通过组合这些
维度来减少类的数量时,桥接模式可以帮助实现这一目标。