您的位置:首页 > 其它

设计模式之Bridge学习笔记

2010-12-22 14:08 190 查看
设计模式之Bridge学习笔记
Bridge 桥接(结构型模式)

抽象不应该依赖于实现细节,实现细节应该依赖于抽象。

先看一个例子:
加入我们要开发一个同时支持PC和手机的坦克游戏,游戏在PC和手机上功能一样,
都有同样的类型,面临同样的功能需求变化,比如坦克可能有多种不同型号;T50,T75....
对于其中坦克的设计,我们可能很容易设计出来一个Tank的抽象基类,然后各种不同的型号Tank继承自该类;
//public abstract class Tank
{
public abstract void Shot();
public abstract void Run();
public abstract void Trun();
}
//各种实现
public class T50:Tank{...........}
public class T75:Tank{...........}
public class T90:Tank{...........}
如果在PC上运行,上面的实现是可以的,但是PC机和手机上的图形绘制,声效,操作等实现
完全不同。。。。。。。。。因此对于各种型号的坦克,都要提供提供各种不同平台上的坦克
实现:
//PC 平台实现
public class PCT50:T50{''''''''''''}
public class PCT75:T75{''''''''''''}
public class PC90:T90{''''''''''''}
//手机平台实现
public class MobileT50:T50{''''''''''''}
public class MobileT75:T75{''''''''''''}
public class MobileT90:T90{''''''''''''}
这样设计会带来很多问题:有很多重复代码,类的结构过于复杂,难以维护,最致命
是引入人核心平台,比如在TV上的Tank游戏,都会让整个类层级结构复杂化。
动机(Motivation)
思考上述问题的症结:事实上由于Tank类型的固有逻辑,使得Tank类型具有了两个变化的维度
————一个变化的维度为“平台的变化” ,一个变化维度为“型号的变化”
如何应对这种对维度的变化???如何利用面向对象技术来使得Tank类型可以轻松地沿着
平台和型号两个方向变化,而引入额为的复杂度?
意图(Intent)
将抽象部分与实现部分分离,使他们都可以独立地变化。
public abstract class TankPlatformImpolementation
{
public abstract void MoveTankTo(Point to);
public abstract void DrawTank();
public abstract DoShot();
}
//
public abstract class Tank
{
protected TankPlatformImpolementation tankImpl;

public Tank(TankPlatformImpolementation tankImpl)
{
this.tankImpl=tankImpl;
}
public TankPlatformImpolementation TankImp1
{
get{return tankImpl;}
set{tankImpl=value;}
}
public abstract void Shot();
public abstract void Run();
public abstract void Trun();
}

public class T50:Tank

{
public T50(ankPlatformImpolementation tankImpl):base( tankImpl)
public override void Shot()
{
tankTmp1.DoShot();
}
}
public class T90:Tank

{
public T90(ankPlatformImpolementation tankImpl):base( tankImpl)
public override void Shot()
{
tankTmp1.DoShot();
}
}

//pc
public class PCTankPlatformImpolementation:TankPlatformImpolementation
{
public override void MoveTankTo(Point to){........}
public override ract void DrawTank(){........}
public override DoShot(){........}
}
//Mobile
public class MobileTankPlatformImpolementation:TankPlatformImpolementation
{
public override void MoveTankTo(Point to){........}
public override ract void DrawTank(){........}
public override DoShot(){........}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: