使用场景
- “抽象部分”和“实现部分”可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
- 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。
- 对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
角色
● 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
● 修正抽象化(RefinedAbstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
● 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
● 具体实现化(ConcreteImplementor)角色:这个角色给出实现化角色接口的具体实现。
结构图
代码
客户端调用
static void Main(string[] args) { //创建一个圆形 Shape shape = new Circle(); //给圆形蓝色的颜料 !!!!!!!我认为是这里体现了桥接 shape.setDraw(new Blue()); //上色 shape.draw(); }
一个维度(颜色)的接口
//定义一个颜色的接口 public interface IColor { public void paint(); }
具体颜色实现接口
//到底是什么颜色 public class Blue :IColor { public void paint() { Console.WriteLine("画上蓝色"); } } public class Green : IColor { public void paint() { Console.WriteLine("画上绿色"); } }
另外一个维度的抽象类
//抽象形状类 public abstract class Shape { protected IColor color; public void setDraw(IColor color) { this.color = color; } public abstract void draw(); }
具体实现类
public class Circle : Shape { public override void draw() { Console.WriteLine("我是圆形"); color.paint(); } }