0%

设计模式之组合模式和迭代器模式

设计模式基础(12):组合模式&迭代器

包含组合模式&迭代器两种模式中的C++示例代码、面向的问题、图解两种模式核心思想

组合模式

面向的需求

  • 对”部分-整体“这两种不同的对象,具有相同的使用接口。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <list>
#include <string>
#include <algorithm>

using namespace std;

class Component
{
public:
virtual void process() = 0;
virtual ~Component(){}
};

//树节点
class Composite : public Component{

string name;
list<Component*> elements;
public:
Composite(const string & s) : name(s) {}

void add(Component* element) {
elements.push_back(element);
}
void remove(Component* element){
elements.remove(element);
}

void process(){

//1. process current node
//2. process leaf nodes
for (auto &e : elements)
e->process(); //多态调用

}
};

//叶子节点
class Leaf : public Component{
string name;
public:
Leaf(string s) : name(s) {}

void process(){
//process current node
}
};

void Invoke(Component & c){
//...
c.process();
//...
}

int main()
{

Composite root("root");
Composite treeNode1("treeNode1");
Composite treeNode2("treeNode2");
Composite treeNode3("treeNode3");
Composite treeNode4("treeNode4");
Leaf leat1("left1");
Leaf leat2("left2");

root.add(&treeNode1);
treeNode1.add(&treeNode2);
treeNode2.add(&leaf1);

root.add(&treeNode3);
treeNode3.add(&treeNode4);
treeNode4.add(&leaf2);

Invoke(root);
Invoke(leaf2);
Invoke(treeNode3);

}

代码思想分析

组合模式

关键点

  • 采用树形结构使得,之前对于多个类型的操作,统一为对一种类型的操作。
  • 封装整体中的进一步细化操作,实现接口一致。

迭代器

面向的需求

  • 面对不同的容器,不用关心其内部实现,为容器提供一套统一的调用接口。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
template<typename T>
class Iterator
{
public:
virtual void first() = 0;
virtual void next() = 0;
virtual bool isDone() const = 0;
virtual T& current() = 0;
};

template<typename T>
class MyCollection{

public:

Iterator<T> GetIterator(){
//...
}

};

template<typename T>
class CollectionIterator : public Iterator<T>{
MyCollection<T> mc;
public:

CollectionIterator(const MyCollection<T> & c): mc(c){ }

void first() override {

}
void next() override {

}
bool isDone() const override{

}
T& current() override{

}
};

void MyAlgorithm()
{
MyCollection<int> mc;

Iterator<int> iter= mc.GetIterator();

for (iter.first(); !iter.isDone(); iter.next()){
cout << iter.current() << endl;
}

}

代码思想分析

迭代器

关键点

  • 需要指出当前的设计思路为面向对象下迭代器设计,C++中目前多采用泛型编程的思想,这种方法已经逐渐抛弃。
  • 但迭代器的总体思想还是不变的,为使用者提供一套统一接口,忽略容器内部实现的差异。