桥接模式

桥接模式解决的是双维度或多维的变化的问题。

意图将抽象部分与实现部分分离,使它们都可以独立的变化。[GOF 《设计模式》]

结构图:

 

不多废话,先看code,待会解释这个UML。

背景介绍:现在要开发个坦克游戏,要求有PC端和手机端版本,坦克型号有各种型号例子中T50和T75为例。坦克的基本功能:Shot、Run等。

public abstract class Tank
    {
        protected TankPlatformImplementation tankImpl;
 
        public Tank(TankPlatformImplementation tankImpl)
        {
            this.tankImpl = tankImpl;
        }
        public abstract void Shot();
        public abstract void Run();
        public abstract void Stop();
    }
public abstract class TankPlatformImplementation//这个自然是做桥接用的
   {
       public abstract void MoveTankTo();//其实代码很多都重复(如移动Move和Run),如果不用桥接的话一方面会产生重复代码
 
       public abstract void DrawTank();
 
       public abstract void DoShot();
   }

那么现在看看TankPlatformImplementation的两个子类吧:

public class MobileTankImplementation:TankPlatformImplementation
   {
       public override void DoShot()
       {
           throw new NotImplementedException();
       }
 
       public override void DrawTank()
       {
           throw new NotImplementedException();
       }
 
       public override void MoveTankTo()
       {
           throw new NotImplementedException();
       }
   }
public class PCTankImplementation:TankPlatformImplementation
   {
       public override void MoveTankTo()
       {
           throw new NotImplementedException();
       }
 
       public override void DoShot()
       {
           throw new NotImplementedException();
       }
 
       public override void DrawTank()
       {
           throw new NotImplementedException();
       }
   }

现在就看看型号是怎么继承Tank的吧,还有看看他的代码是怎么复用。

public class T50:Tank
   {
       public T50(TankPlatformImplementation tankImpl) : base(tankImpl)
       {
 
       }
 
       public override void Run()
       {
           throw new NotImplementedException();
       }
 
       public override void Shot()
       {
           throw new NotImplementedException();
       }
 
       public override void Stop()
       {
           throw new NotImplementedException();
       }
   }
public class T75:Tank
   {
       public T75(TankPlatformImplementation tankImpl) : base(tankImpl)
       {
 
       }
 
       public override void Run()
       {
           throw new NotImplementedException();
       }
 
       public override void Shot()
       {
           throw new NotImplementedException();
       }
 
       public override void Stop()
       {
           throw new NotImplementedException();
       }
   }

就T75而言,它自然是继承了Tank了,然后它要对Run等进行了重写。那么既然T75继承了Tank了,就当然用有了它的protect的方法,就是拥有了这个TankPlatformImplementation类,它当然可以调用TankPlatformImplementation 的MoveTankTo()等方法,是不是方法复用了。

上面说的有点乱,主要是没有uml图辅助说明。时间也仓储,当做日记记录了。

 

参考文献:http://terrylee.cnblogs.com/archive/2006/02/24/336652.html 他这里说的比我还清楚。

 

 

 

 

 

 

posted @   小霖2012  阅读(233)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
历史上的今天:
2011-07-30 jQuery定义类及扩展
点击右上角即可分享
微信分享提示