桥接模式的意图,与适配器很相似
适配器,将原有的接口转换成另一种接口,不改变原有接口,达到不同的接口适配
桥接模式,在变化的点之间,架起一种桥,使得可以很方便的与不同的点进行统一的通信
比如:游戏安装在不同的机器上,游戏的低层接口都是统一的,针对于不同的平台
低层的实现方式不一样,只需要保证游戏在不同的机器上可以实现同样的效果
继承会带来的麻烦?
对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现
子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现的任何变化都会导致子类发生变化,当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换,这种依懒关系限制了灵活性并最终限制了复用性
合成/聚合复用原则
尽量使用合成聚合,尽量不要使用类继承
聚合表示一种弱的拥有关系
合成表示一种强的拥有关系,体现了严格的部分和整体的关系
合成/聚合复用原则的好处
优先使用对象的合成聚合将有助于保持每个类被封装,并被集中在单个任务上
这样类类继承层层次会保持较小的规模,并且不大可能增长为不可控制的庞然大物
桥接的结构图
桥接模式要注意的点:
以下为示例代码
/// <summary> /// 通过这个类将refiendabstraction与concreteImplementorB或者C关联起来 /// </summary> class Abstraction { protected Implementor Implementor; public void SetImplementor(Implementor implementor) { this.Implementor = implementor; } public virtual void Operation() { Implementor.Operation(); } }
class RefiendAbstraction:Abstraction { public override void Operation() { Implementor.Operation(); } }
abstract class Implementor { public abstract void Operation(); }
class ConcreteImplementorA:Implementor { public override void Operation() { Console.WriteLine("ConcreteImplementorA的实现方式"); } }
class ConcreteImplementorB:Implementor { public override void Operation() { Console.WriteLine("ConcreteImplementorB的实现方式"); } }
static void Main(string[] args) { Abstraction abstraction=new RefiendAbstraction(); abstraction.SetImplementor(new ConcreteImplementorA()); abstraction.Operation(); abstraction.SetImplementor(new ConcreteImplementorB()); abstraction.Operation(); Console.ReadLine(); }