原文:C#设计模式之九组合模式(Composite Pattern)【布局型】
一、引言
今天我们要讲【布局型】设计模式的第四个模式,该模式是【组合模式】,英文名称是:Composite Pattern。当我们谈到这个模式的时候,有一个物件和这个模式很像,也切合这个模式要表达的意思,那就是“俄罗斯套娃”。“俄罗斯套娃”就是大的瓷器娃娃里面装着一个小的瓷器娃娃,小的瓷器娃娃里面再装着更小的瓷器娃娃,直到最后一个不能再装更小的瓷器娃娃的阿谁瓷器娃娃为止(有点绕,下面我会配图,一看就大白)。在我们的操纵系统中有文件夹的观点,文件夹可以包罗文件夹,可以嵌套多层,最里面包罗的是文件,这个观点和“俄罗斯套娃”很像。固然还有很多的例子,例如我们使用系统的时候,会使用到“系统菜单”,这个对象是树形布局。这些例子包罗的这些对象或者说是东西,可以分为两类,一类是:容器东西,可以包罗其他的子东西;另一类是:叶子东西,这类东西是不能在包罗其他东西的东西了。在软件设计中,我们该怎么措置惩罚惩罚这种情况呢?是每类东西分袂看待,还是供给一个统一的操纵方法呢。组合模式给我们供给了一种解决此类问题的一个途径,接下来我们就好好的介绍一下“组合模式”吧。
二、组合模式的详细介绍
2.1、动机(Motivate)
客户代码过多地依赖于东西容器(东西容器是东西的容器,细细评味)庞大的内部实现布局,东西容器内部实现布局(而非抽象接口)的变革将引起客户代码的频繁变革,带来了代码的维护性、扩展性等方面的毛病。如何将“客户代码与庞大的东西容器布局”解耦?如何让东西容器本身来实现自身的庞大布局,从而使得客户代码就像措置惩罚惩罚简单东西一样来措置惩罚惩罚庞大的东西容器?
2.2、意图(Intent)
将东西组合成树形布局以暗示“部分-整体”的条理布局。Composite使得用户对单个东西和组合东西的使用具有一致性。 —— 《设计模式》GoF
2.3、布局图(Structure)
2.4、模式的构成
组合模式中涉及到三个角色:
(1)、抽象构件角色(Component):这是一个抽象角色,它给参与组合的东西界说出了大众的接口及默认行为,,可以用来打点所有的子东西(在透明式的组合模式是这样的)。在安适式的组合模式里,构件角色并不界说出打点子东西的要领,这必然义由树枝布局东西给出。
(2)、树叶构件角色(Leaf):树叶东西是没有下级子东西的东西,界说出参与组合的原始东西的行为。(原始东西的行为可以理解为没有容器东西打点子东西的要领,或者 【原始东西行为】+【打点子东西的行为(Add,Remove等)】=面对客户代码的接口行为调集)
(3)、树枝构件角色(Composite):代表参与组合的有下级子东西的东西,树枝东西给出所有打点子东西的要领实现,如Add、Remove等。
组合模式实现的最关键的处所是——简单东西和复合东西必需实现不异的接口。这就是组合模式能够将组合东西和简单东西进行一致措置惩罚惩罚的原因。
2.5、组合模式的具体代码实现
组合模式有两种实现方法,一种是:透明式的组合模式,此外一种是:安适式的组合模式。在这里我就详细说一下何为“透明式”,何为“安适式”。所谓透明式是指“抽象构件角色”界说的接口行为调集包罗两个部分,一部分是叶子东西自己所包罗的行为(好比Operation),此外一部分是容器东西自己所包罗的打点子东西的行为(Add,Remove)。这个抽象构件必需同时包罗这两类东西所有的行为,客户端代码才会透明的使用,无论挪用容器东西还是叶子东西,接口要领都是一样的,这就是透明,针对客户端代码的透明,但是也有他本身的问题,叶子东西不会包罗本身的子东西,为什么要有Add,Remove等类似要领呢,挪用叶子东西这样的要领可能(注意:我这里说的是可能,因为有些人会把这些要领实现为空,不做任何行动,固然也不会有异常抛出了,不要抬杠)会抛出异常,这样就不安适了,然后人们就提出了“安适式的组合模式”。所谓安适式是指“抽象构件角色”只界说叶子东西的要领,确切的说这个抽象构件只界说两类东西共有的行为,然后容器东西的要领界说在“树枝构件角色”上,这样叶子东西有叶子东西的要领,容器东西有容器东西的要领,这样责任很明确,固然挪用必定不会抛出异常了。大家可以按照本身的情况自行选择是实现为“透视式”还是“安适式”的,以下我们会针对这两种情况都有实现,具体实现如下: