今天在看cocos2d的时候,看到Action的设计采用了组合模式和装饰模式,可以将一系列的action组合起来,让CCNodec对象执行,就像给CCNode下达一系列的命令一样.
例如以下代码:
1 CCActionInterval* move =CCMoveBy::actionWithDuration(0.5f, ccp(0,160));
2 CCActionInterval*rotate = CCRotateBy::actionWithDuration(2, 360);
3 CCActionInterval*scale = CCScaleBy::actionWithDuration(2, 5);
4 CCActionInterval*opacity = CCFadeOut::actionWithDuration(2);
5 CCActionInterval*fadein = CCFadeIn::actionWithDuration(2);
6 CCActionInterval* scaleback =CCScaleTo::actionWithDuration(1, 1);
7 CCFiniteTimeAction*seq0 = CCSequence::actions(move, rotate, scale, opacity, fadein, scaleback,NULL);
8 Actor->runAction(seq0);
于是就看了一下组合模式,写了个小例子:
1 #include <vector>
2 //组合模式是为了让访问单一对象与多个对象具有一致性。
3 // 想一下我们就可以知道可以用循环去遍历对象数组。提供通用接口
4 abstract class Component
5 {
6 public: vector<Component> vect ;
7 virtual int add() = 0 ;
8 virtual int del(&Component) = 0 ;
9 virtual int run() = 0 ;
10 };
11 class composite:public Component
12 {
13 public: composite();
14 int add(&Component);
15 int del(&Component);
16 int run();
17 ~composite();
18 };
19
20 composite::composite() { }
21 composite::add(Component &item)
22 { vect.push_back(item); }
23 composite::del(Component &item)
24 {
25 for( vector<Component*>::iterator it=vect.begin();it!=vect.end() )
26 {
27 //erase()并不会删除*it指向的对象,所以我们需要额外释放它
28 //这里如何判断两个对象是否相等呢?我们可以判断它们的地址是否相等
29 it == item ? vect.erase(it) : it++ ;
30 }
31 //使用swap来减少容量
32 vector(vect).swap(vect);
33 }
34 composite::run()
35 {
36 vector<Component*>::iterator it ;
37 for( it= vect.begin();it!=vect.end();it++ )
38 { *it->run() ; }
39 }
40 composite::~composite() {}
41 int main()
42 {
43 composite vect = new composite();
44 //单个对象
45 Component single = new Component();
46 vect.add(&single);
47 vect.run();
48 Component mul1 = new Component();
49 Component mul2 = new Component();
50 Component mul3 = new Component();
51 vect.add(&mul1);
52 vect.add(&mul2);
53 vect.add(&mul3);
54 vect.run();
55 //向量内存放的只是对象的副本,所以析构时不会释放对象的内存,我们需要手动释放
56 delete single ;
57 delete mul1;
58 delete mul2;
59 delete mul3;
60 return 0;
61 }
平时用C++不多,看了大半天的STL,真感慨C++的内存管理如此复杂...
原文链接: https://www.cnblogs.com/trying/archive/2012/11/08/2863838.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/68610
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!