无废话C#设计模式之十二:Bridge

意图

将抽象部分与实现部分分离,使它们都可以独立的变化。

场景

还是说我们要做的网络游戏,多个场景需要扩充的问题我们已经采用了创建型模式来解决。现在的问题就是,不仅仅是游戏场景会不断扩充,而且游戏的模式也在不断扩充。比如,除了最基本的战斗模式之外,还会有道具模式,金币模式等。

对于这种在多个维度上都会有变化或扩充需求的项目来说,可以考虑引入桥接模式。或许你会说,不管是什么场景,不管什么模式,都可以是抽象场景的一个子类,但是,如果这样的话,4个场景和3种模式就会产生12个子类,而10个场景5种模式就会有50个子类。一味进行继承并不是什么好方法,桥接模式的思想是把继承转化为组合,把乘法(10*5=50)转化为加法(10+5=15)。

示例代码

using System;

using System.Collections.Generic;

using System.Text;

namespace BridgeExample

{

    class Program

    {

        static void Main(string[] args)

        {

            PatrixScene halfPaper = new HalfPaper();

            halfPaper.Mode = new GoldMode();

            halfPaper.LoadScene();

            PatrixScene matrix = new Matrix();

            matrix.Mode = new PrpoertyMode();

            matrix.LoadScene();

        }

    }

    abstract class PatrixScene

    {

        protected GameMode mode;

        public GameMode Mode

        {

            get { return mode; }

            set { mode = value; }

        }

        public abstract void LoadScene();

    }

    class HalfPaper : PatrixScene

    {

        public override void LoadScene()

        {

            Console.WriteLine("Load HalfPaper Completed");

            mode.InitScene();

        }

    }

    class Matrix : PatrixScene

    {

        public override void LoadScene()

        {

            Console.WriteLine("Load Matrix Completed");

            mode.InitScene();

        }

    }

    abstract class GameMode

    {

        public abstract void InitScene();

    }

    class PrpoertyMode : GameMode

    {

        public override void InitScene()

        {

            Console.WriteLine("Init Property Mode Completed");

        }

    }

    class GoldMode : GameMode

    {

        public override void InitScene()

        {

            Console.WriteLine("Init Gold Mode Completed");

        }

    }

}

代码执行结果如下图:

 

代码说明

l         PatrixScene类是抽象化角色。虽然说针对第一维度也就是游戏场景,PatrixScene也是一个抽象,但是我觉得这里说的抽象化和实现化还是针对第二维度的,也就是游戏模式。

l         GameMode类就是实现化角色。你或许会说对于多个维度,把哪个作为抽象化角色呢?虽然维度是一个平行的概念,但是对于Bridge模式来说,我觉得它是把相对高层的角色作为抽象化角色,而把比较底层的操作作为实现化角色的。比如,对于场景和模式来说,模式是为场景服务的,我们就把场景作为抽象化角色。

l         HalfPaper和Matrix都是修正抽象化角色。按照GOF的定义是说修正父类的抽象化定义。其实,我觉得抽象化角色不一定必须是对方法有默认实现,并且由子类进行修正。

l         PropertyMode和GoldMode是具体实现化角色。它们用来实现实现化角色定义的接口。

l         从一个角度来说,抽象化和修正抽象化角色相对应实现化和具体实现化角色,从另外一个角度来说,抽象化和实现化角色对应修正抽象化和具体实现化角色。

l         客户端代码中直接选择合适的具体实现化角色。看到这里,你可能觉得和策略模式很像。其实,策略模式针对面更小一点,一是针对算法替换,二是只针对一个维度的变化点,因此它也就只有一个抽象角色。

何时采用

l         从代码角度来说,如果类型的继承是处于2个目的(违背单一职责原则)的话可以使用Bridge模式避免过多的子类。

l         从应用角度来说, 如果应用会在多个维度上进行变化,客户端希望两个维度(场景、游戏模式)的对象相对独立,动态耦合(客户端决定哪个场景和哪个游戏模式耦合)的时候可以考虑Bridge模式。

实现要点

l         选择合适的类型作为抽象化角色(第一维度)。

l         抽象化角色和实现化角色通过组合进行关联。

l         抽象和实现不绑定,允许客户端作切换。

注意事项

 

l         无

(原创)无废话C#设计模式之十二:Bridge相关推荐

  1. (原创)无废话C#设计模式之十九:Observer

    无废话C#设计模式之十九:Observer 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 场景 这次不说游戏了,假设我们需要在一个W ...

  2. (原创)无废话C#设计模式之二十二:总结(针对GOF23)

    无废话C#设计模式之二十二:总结(针对GOF23) 比较 设计模式 常用程度 适用层次 引入时机 结构复杂度 Abstract Factory 比较常用 应用级 设计时 比较复杂 Builder 一般 ...

  3. (原创)无废话C#设计模式之十一:Composite

    无废话C#设计模式之十一:Composite 意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite模式使得用户对单个对象和组合对象的使用具有一致性. 场景 ...

  4. (原创)无废话C#设计模式之十七:Chain Of Resp.

    无废话C#设计模式之十七:Chain Of Resp. 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象能处理 ...

  5. (原创)无废话C#设计模式之四:Factory Method

    无废话C#设计模式之四:Factory Method       <a href='http://xgb.xgb.cc'>a</a>   <a href='http:// ...

  6. Java设计模式(十二) 策略模式

    策略模式介绍 策略模式定义 策略模式(Strategy Pattern),将各种算法封装到具体的类中,作为一个抽象策略类的子类,使得它们可以互换.客户端可以自行决定使用哪种算法. 策略模式类图 策略模 ...

  7. 二十三种设计模式(第十二种)-----代理模式(Proxy)

    二十三种设计模式(第十二种)-----代理模式(Proxy) 尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&se ...

  8. 设计模式(十二)—— 享元模式

    设计模式(十二)-- 享元模式 定义 结构 案例实现 优缺点和使用场景 JDK源码解析 定义 运用共享技术来有效地支持大量细粒度对象的复用.它通过共享已经存在的对象来大幅度减少需要创建的对象数量.避免 ...

  9. 云计算设计模式(十二)——索引表模式

    云计算设计模式(十二)--索引表模式 创建索引过的被查询条件经常被引用的数据存储等领域.这种模式可以通过允许应用程序更快速地定位数据来从数据存储中检索提高查询性能. 背景和问题 许多数据存储通过使用主 ...

最新文章

  1. Error in ** : incorrect number of dimensions
  2. ad走线画直线_作为立体几何的热点,直线与平面的平行关系,到处都是考试的影子...
  3. [转]浅谈浏览器插件检测 和自定义协议的支持
  4. es6 取数组的第一个和最后一个_JS算法题之每日一题- 17.在排序数组中查找元素的第一个和最后一个位置...
  5. java相同数组拼接_java遍历数组并重新拼接数组里的元素
  6. 最受欢迎的java技术_最受欢迎的Java环境
  7. 独家下载!小程序Serverless云上开发一站到底
  8. linux sed工具,玩转Linux - 神级工具 sed awk
  9. mysql o_Mysql数据类型
  10. 任何在aix下面看你的系统是32位还是64位的
  11. python函数传递列表_python传递列表作为函数参数
  12. (转)献给迷茫中的量化工作者
  13. python绘制缓和曲线_CAD里面如何绘制缓和曲线
  14. java dagger2_Dagger2用法整理
  15. aps生产排程出色的软件功能
  16. 协方差、相关系数(Pearson 相关系数)
  17. 使用树莓派3开发板,基于android things 物联网系统来运行TensorFlow解析图像
  18. JS实现星星评分系统
  19. 字蛛font-spider报错,web font not found,碰到的最新问题及解决方法
  20. 怎样识别app网站服务器在国外,APP服务器你了解多少?什么是海外app服务器

热门文章

  1. HDU2016 数据的交换输出
  2. 【剑指offer】题目二
  3. django(未解决的问题)
  4. Linux(Ubuntu)下MySQL的安装与配置
  5. 火狐浏览器缓存登录名、密码解决方法
  6. firefox 自定义快捷键
  7. GPass:GNOME 暗码治理器
  8. ArcGIS中标注之一上下标、分数等特殊形式标注(转)
  9. 简述冯诺依曼工作原理_深入浅出讲解计算机原理
  10. Spring MVC笔记