《大话设计模式》--笔记(桥接模式)

桥接模式:将抽象部分与它的实现部分分开,使它们都可以独立地变化
这句话理解:什么叫抽象与它的实现分开,这并不是说,让抽象类与其派生类分开,
因为这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。

说到桥接模式,先谈谈类的继承。在类的继承中也有不足之处。
比如,对象的继承关系在编译时就定义好了,所以无法在运行时改变从父类继承的实现。
子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致
子类发生变化。当你需要复用的子类时,如果继承下来的实现不适合解诀新的问题时,则父类必须重写或
被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

在面向对象设计中,我们还有一个很重要的设计原则,那就是合成/聚合复用原则。
即优先使用对象的合成/聚合,而不是类的继承。

合成/聚合复用原则
    聚合表示一种弱的‘拥有’关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。
    合成则是一种强的‘拥有’关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。

合成/聚合复用原则的好得是:优先使用对象的合成/聚合将有助于你保持每个类被封装。并被集中到单个的任务上,
这样类和类的继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。

 

下面来看看桥接模式的基本代码:

 

abstract class Implementor { public abstract void Operation(); }

 

/// <summary> /// /// </summary> class ImplementorA:Implementor { public override void Operation() { Console.WriteLine("具体实现A的方法执行"); } }

 

 

/// <summary> /// /// </summary> class ImplementorB:Implementor { public override void Operation() { Console.WriteLine("具体实现B的方法执行"); } }

 

/// <summary> /// /// </summary> class Abstraction { protected Implementor implementor; public void SetImplementor(Implementor implementor) { this.implementor = implementor; } public virtual void Operation() { implementor.Operation(); } }

 

 

class Program { static void Main(string[] args) { Abstraction ab = new Abstraction(); ab.SetImplementor(new ImplementorA()); ab.Operation(); ab.SetImplementor(new ImplementorB()); ab.Operation(); Console.Read(); } }

你可能感兴趣的:(《大话设计模式》--笔记(桥接模式))