设计模式学习笔记八(Bridge桥接模式)

动机:对象具有两个以上的维度变化。如何利用面向对象技术来解决该问题,而不引入额外的复杂度。

意图:将抽象部分与实现部分分离(一个事物中多个维度变化相分离),使得它们都可以独立地变化。

 

基本Code

public abstract class Tank

{

     public abstract void Shot();

     public abstract void Run();

     public abstract void Stop();

}

 

public class T75:Tank

{

     public override void Shot()

     {

         //T75

     }

     public override void Run()

     {

         //T75

     }

     public override void Stop()

     {

         //T75

     }

}

 

public class T50:Tank

{

     public override void Shot()

     {

         //T50

     }

     public override void Run()

     {

         //T50

     }

     public override void Stop()

     {

         //T50

     }

}

 

public class PCT50:T50

{

     //.

}

 

public class MobileT50:T50

{

     //

}

 

public class PCT75:T75

{

     //

}

 

public class MobileT75:T75

{

     //

}

在此代码中,注意两个变化点,Tank的型号和平台都在变化,这样可能产生大量的重复代码。在此基础上使用桥接模式如下:

public abstract class TankPlatformImplementation

{

     public abstract void MoveTo(Point to);

     public abstract void DrawTank();

     public abstract void DoShot();

}

public class PCTankPlatformImplementation: TankPlatformImplementation

{

     public override void MoveTo(Point to)

     {

     }

     public override void DrawTank()

     {

     }

     public override void DoShot()

     {

     }

}

 

public class MobileTankPlatformImplementation: TankPlatformImplementation

{

     public override void MoveTo(Point to)

     {

     }

     public override void DrawTank()

     {

     }

     public override void DoShot()

     {

     }

}

 

public abstract class Tank

{

     protected  TankPlatformImplementation tankImpl;

     public Tank(TankPlatformImplementation tankImpl)

     {

         This.tankImpl=tankImpl;

     }

    

     public TankPlatformImplementation TankImpl

     {

         get{ return tankImpl;}

         set{ tankImpl=value;}

     }

     public abstract void Shot();

     public abstract void Run();

     public abstract void Stop();

}

public class T50:Tank

{

     public T50(TankPlatformImplementation tankImpl):base(tankImpl)

     {

     }

     public override void Shot()

     {

         // T50

         tankImpl.DoShot();

     }

     public override void Run()

     {

         //T50.

         //tankImpl

     }

     public override void Stop()

     {

         //T50

         //tankImpl

     }

}

public class T75:Tank

{

     public T75(TankPlatformImplementation tankImpl):base(tankImpl)

     {

     }

 

     public override void Shot()

     {

         // T75

         tankImpl.DoShot();

     }

     public override void Run()

     {

         //T75.

         //tankImpl

     }

     public override void Stop()

     {

         //T75

         //tankImpl

     }

}

 

class App

{

     static void Main()

     {

         TankPlatformImplementation tankImpl=new MobileTankPlatformImplementation();

         T50  tank=new T50(tankImpl);

     }

}

 

Bridge模式结构图如下所示:

 

Bridge模式要点

1、  Bridge模式使用“对象间的组合关系”解耦了抽象与实现之间固有的绑定关系,使用抽象和实现可以沿着各自的维度的变化。

2、  所谓抽象和实现沿着各自维度的变化,即“子类化”它们,比如不同的Tank型号子类和不同的平台子类。得到各个子类之后,便可以任意组合它们,从而获得不同平台的不同型号。

3、  Bridge模式有时候类似于多继承方案,但是多继承往往违背单一职责原则(即一个类只有一个变化点的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。

4、  Bridge模式一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈――换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。

 

在使用此模式的时候,代价是比较大的哈。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值