概要
具备一系列既有独立功能,又需要排列组合其中的几种功能来达成一些复合的新功能时,可以采用组合模式。比如说,你设计了一个备份模块,有email备份,note备份,message备份,log备份等一系列备份功能,而你又会需要同时备份它们中间不定的几种时,考虑用组合模式吧。它能组合对象处理,而又不增加额外的耦合,并保证接口一致,以及模块的易用性和扩展性。
目的
自由组合既有对象处理来实现复合对象,保证单一对象和复合对象具有统一的对外接口。
实例
Command模式应该都比较熟悉了,这里结合Command模式来举个例子。
有时我们会把行为(action)封装为类,比如我们需要如下这些action,保存action,备份action,发送action,显示action等,那么考虑用Command模式来进行封装,如下所示:

class CommandAction {
public:
virtual void Execute ();
};
class SaveAction : public CommandAction {
public:
virtual void Execute ();
};
class BackupAction : public CommandAction {
public:
virtual void Execute ();
};
class SendAction : public CommandAction {
public:
virtual void Execute ();
};
......
我们有需要实现几种复合行为,Composite1是(保存+备份)action,Composite2是(保存+显示)action,Composite3是(保存+显示+发送)action,不要告诉我你会如下这样去实现!为每种复合行为都设计一个类?

(省略Composite2, Composite3)
很容易看出,这不是一种好方法,扩展性太差,增加了类间的耦合度。如果又需要更多的不同的复合行为,难道再继续追加类?太复杂,太烦了,模块维护者看到这种设计会疯掉的。
那么,让我们看看如果用Composite模式是怎么解决的。

设计一个CompositeAction类,具有跟其他Action统一的接口(Execute),CompositeAction包含一个基类CommandAction的list容器对象,通过AddAction和DeleteAction,可以由Client调用方自由追加和删除复合对象中需要包含的Action,而Execute方法会执行list中push进来的所有Action。
应用
本文介绍组合模式的概念及其在软件设计中的应用。通过一个具体的备份模块案例,展示了如何利用组合模式自由组合多个独立的功能来实现复合功能,同时保持接口的一致性和模块的易用性及扩展性。
771

被折叠的 条评论
为什么被折叠?



