zoukankan      html  css  js  c++  java
  • 桥接模式

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

    意图将抽象部分与实现部分分离,使它们都可以独立的变化。[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 他这里说的比我还清楚。

     

  • 相关阅读:
    Log4net的一点改进
    SONY的几款秋季新品都还是很不错的
    在VisualStudio 工具箱中隐藏用户控件
    WPF中的DesignMode判断
    SONY的一款Win8平板
    .Net中的不可变集合(Immutable Collection)简介
    C++ 11中几个我比较喜欢的语法(三)
    很好用的谷歌字体以及Gravatar头像一键替换WordPress插件----WP Acceleration for China 插件
    关于微信获取access_token接口,返回值为-1000的问题
    主合同与补充合同的区别有哪些?
  • 原文地址:https://www.cnblogs.com/huaizuo/p/2616047.html
Copyright © 2011-2022 走看看