备忘录模型
前面通过自动贩卖机(迭代器模式),冰淇淋的销售问题变得很好。
于是啃得鸡研发了一条自动化冰淇淋生成线,可以生成多种口味,多种配方的冰淇淋。
每种冰淇淋的销量,目前是不确定的。为了减少不必要的浪费,希望可以根据市场变动,动态调整冰淇淋是生产。
# 场景分析
一条生成线可以完成所有产品的生产的同时,也意味着产品线的复杂。
这里的冰淇淋生产线是自动化的,为电脑控制;
解决思路为:将各种产品的生产参数进行备份、存档。
当需要的时候就可以一键使用。
# 实现
# 类图
# 代码
IceFactoryOriginator: 备忘录使用类
class IceFactoryOriginator
{
public:
IceFactoryOriginator()
: m_sflavour("")
, m_sDryFruit("") {}
void setFlavour(string flavour)
{
this->m_sflavour = flavour;
}
void setDryFruit(string dryFruit)
{
this->m_sDryFruit = dryFruit;
}
IceCream* createCream()
{
IceCream *pIceCream = new IceCream(m_sflavour, m_sDryFruit);
return pIceCream;
}
Memento* createMemento()
{
return new Memento(m_sflavour, m_sDryFruit);
}
void restoreMemento(Memento* memento)
{
m_sflavour = memento->getFlavour();
m_sDryFruit = memento->getDryFruit();
}
private:
string m_sflavour;
string m_sDryFruit;
};
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
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
Memento: 备忘录
class Memento
{
public:
Memento(string flavour, string dryFruit)
: m_sflavour(flavour)
, m_sDryFruit(dryFruit) {}
string getFlavour() { return m_sflavour; }
string getDryFruit() { return m_sDryFruit; }
private:
string m_sflavour;
string m_sDryFruit;
};
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
CareTaker: 备忘录管理类
class CareTaker
{
public:
CareTaker() {}
~CareTaker()
{
for (auto oIterator = m_oMementos.begin(); oIterator != m_oMementos.end(); ++oIterator)
{
delete *oIterator;
}
m_oMementos.clear();
}
void add(Memento* memento) { this->m_oMementos.push_back(memento); }
Memento* get(int index) { return this->m_oMementos[index]; }
private:
vector<Memento*> m_oMementos;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 代码
仓库位置:https://github.com/su-dd/demo.git (opens new window)
代码位置:设计模式/Memento (opens new window)
# 感悟
备忘录是为系统的运行提供了后悔药;让系统可以在需要的时机,可以回到希望的状态。
常见的应用场景:撤销恢复,游戏存档,数据库事务等。
当一个对象的所有信息都需要进入备忘录,我们可以思考使用 : 原型模式 + 备忘录模式
通过原型模式的自copy,我们不会丢失任何数据;并可以将 备忘录中 的备忘录使用者和备忘录统一。
编辑 (opens new window)
上次更新: 2023/04/09, 11:59:04