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