博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式系列】结构型模式之Composite模式
阅读量:6434 次
发布时间:2019-06-23

本文共 2627 字,大约阅读时间需要 8 分钟。

概要
具备一系列既有独立功能,又需要排列组合其中的几种功能来达成一些复合的新功能时,可以采用组合模式。比如说,你设计了一个备份模块,有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,不要告诉我你会如下这样去实现!为每种复合行为都设计一个类?
class CommandAction {public:     virtual void Execute ();};class Composite1: public CommandAction {public:     ......     virtual void Execute () {          mSave->Execute();          mBackup->Execute();               }private:     SaveAction* mSave;     BackupAction * mBackup;     };
(省略Composite2, Composite3)
很容易看出,这不是一种好方法,扩展性太差,增加了类间的耦合度。如果又需要更多的不同的复合行为,难道再继续追加类?太复杂,太烦了,模块维护者看到这种设计会疯掉的。
那么,让我们看看如果用Composite模式是怎么解决的。
class CommandAction {public:     virtual void Execute() = 0;     virtual void AddAction(CommandAction* action);     virtual void DeleteAction(CommandAction* action);};class CompositeAction {public:     ......     virtual void Execute() {          list
::iterator it; for (it = mCompositor.begin(); it != mCompositor.end(); it++) { if (*it != NULL) { (*it)->Execute(pack); } } } virtual void AddAction(CommandAction* action) { if (action != NULL) { mCompositor.push_back(action); } } virtual void DeleteAction(CommandAction* action) { list
::iterator it; if (action != NULL) { for (it = mCompositor.begin(); it != mCompositor.end(); it++) { if (*it == action) { mCompositor.erase(it); break; } } }private: list
mCompositor;};
设计一个CompositeAction类,具有跟其他Action统一的接口(Execute),CompositeAction包含一个基类CommandAction的list容器对象,通过AddAction和DeleteAction,可以由Client调用方自由追加和删除复合对象中需要包含的Action,而Execute方法会执行list中push进来的所有Action。
应用
在文件系统库中,存储文件节点包含文件夹和文件的组合,而一些UI库中,复杂的UI也经常会由很多可定制的基本UI组成,当然相关应用还有很多,在这些库中,Composite模式经常会被使用。另外Composite模式也经常跟Decorator模式结合起来使用,关于Decorator模式,在下一单元会有详细的说明。

转载于:https://www.cnblogs.com/secbook/archive/2012/04/10/2655122.html

你可能感兴趣的文章
nginx:413 Request Entity Too Large 及 修改 PHP上传文件大小配置
查看>>
java BigDecimal对象值比较笔记
查看>>
Linux文件路径、cd命令、mkdir命令、rmdir命令、rm命令
查看>>
50.使用Tornado进行网络异步编程
查看>>
oracle 菜单树查询
查看>>
使用工具创建 SpringBoot Web 应用
查看>>
JFinal教程1——小白的第一个JFinal程序
查看>>
golang思考之运行速度之函数调用
查看>>
AndroidPN的学习研究(三)源码流程分析
查看>>
PowerCLI: “WARNING: There were one or more problems with the server certificate”
查看>>
千万级pvj架构设计
查看>>
我的友情链接
查看>>
数据库学习笔记--常用SQL语句
查看>>
客户故事:4家银行如何打造新一代移动金融中心
查看>>
【新书推荐】“十三五”国家重点出版规划项目《网络安全技术及应用》第3版出版发行...
查看>>
《神探tcpdump终结招》-linux命令五分钟系列之四十三
查看>>
博客即日起不再更新,已转移至https://dacat.cc
查看>>
Tomcat的Server.xml虚拟主机和虚拟目录的配置
查看>>
utf8编码
查看>>
sublime插件与使用技巧
查看>>