当前位置:C++技术网 > 资讯 > 菜鸟解析设计模式:3

菜鸟解析设计模式:3

更新时间:2016-08-19 17:06:32浏览次数:1+次

声明:本文参考自郗晓勇的《23种设计模式》

7.桥接

外部调用了抽象。这时,“抽象”通过操作指针,调用了实现者。

初看这些像是这样:(int)float, (int)double。这个(int)就类似于抽象,这个 float 和 double 就类似于操作指针指向的不同。实现者在哪里?当然你看不到。

在 Unity 中,就好比 Monobehaviour 中的 Update。不管你是哪个类,都要被调用 Update,并且在这个遍历中写法并没有什么差别。

也好比 Windows 下的窗口函数。不论哪个窗口,都会被调用 “窗口回调函数”。在调用的过程中,指向的窗口在变化,指向的回调函数更是变化不停。但是都是指向回调函数。这是一个遍历。

与其说这是一种模式,不如说是一种编程习惯。那就是不论什么类(假设类A,B),只要有类似的操作,都用同名函数。要实现这一点,A、B两个类可以继承自同一个基类。(也可以不继承,随你去改。)


好吧。你看,这个东西我们见的并不少,也许还用过很多。我们只是不知道它叫做桥接罢了。




8.组合

看 “组合” 类。它为我们提供了一种挂载机制。我们可以把一个组合挂载到另一个组和下面,形成一种多叉树的结构。组合的基类只提供基本的操作函数,而具体的操作,你可以自己搞一个类,继承这个基类,然后完成具体操作。当然你自己搞的这个类,同样也具备这种挂载机制,具备成为多叉树节点的条件。

所谓叶子,就是继承 “组合” 基类后,仅仅添加需要操作。所谓 “混合的组合”,有两个解释。一是这个组合下面也挂了很多个组合,二是这个组合里面存了其他的很多组合。

这种机制提供的方便是无与伦比的。我们可以通过操作多叉树的父节点,影响该父节点的所有子节点,以及该父节点关联的所有节点。也就是说我们进行操作的时候,只需要考虑一个组合与整体之间的关系(以及一个组合内部节点之间的关系),而不需要考虑单个节点与整体之间的关系。另外,这个基类提供的基本操作函数,也使得调控节点之间的执行顺序变得无比方便。


比如一个袜子,它散发出的臭气可以熏染整个房间。如果使用这种组合机制,那么我们把袜子对象挂在某一个房间下,就只需要考虑袜子对这个房间以及房间中所有生物的影响,而不需要考虑袜子对楼内所有生物的影响。因为既然挂在房间下,默认的影响范围就是这个房间。当然我们也可以改变默认,将臭气通过一根管子引导到别的房间,或是引导到楼内所有的房间。


我为什么使用这个比喻?我想说的事情是,设计模式不是什么高大上的事情,它是一种非常常见的,通俗的事情。比如做木工活,我们要用尺量木头。用尺量木头这个行为,如果换到编程,就称呼为设计模式。这个意思明白吗?也就是说设计模式是我们理所当然就要用到的行为,自然到很多行为是不需要学习的。(当然复杂一些的还是需要学习的,比如本模式)

如果看不明白可以玩玩 Unity。Unity 就是充分的使用了这种组合机制。





9.装饰

原文的解释是:为了避免生成组合的子类,动态的给对象添加一些额外的职责。看 “具体的装饰A” 和 “具体装饰B”, 一个是增加了一个变量,另一个是增加了一个函数(一个操作)。我的理解是为 “装饰” 类加上了一个 void* 型的变量,这样就既不必生成子类,也不减少功能。或者我们可以用其他的方式来实现 “不增加子类,不减少功能” 的目的。我们可以干脆设置一些空的变量,如果需要用到就给上,如果不需要干脆就不管,运行时加一个 if(xx == null) 的判断即可。甚至为了穿插各类的灵活度,单独弄一些用来存储各种额外东西的类也是有必要的。我们会经常用到这个东西。我一开始也觉得这个东西只能称为一种办法而算不上设计模式。可是仔细想想,如果在设计框架的时候留下了足够多的灵活度,意味着编程将方便许多,需求一改,扩展也容易许多。这将是一个蝴蝶效应。鉴于其后果,应该是比较重要的注意事项了。

我也是琢磨半天才理解到这一步。如果我说的有什么问题,或者理解的有错误,欢迎朋友们指正,指导。(应该属于需要特别注意的习惯,看看很有必要)