我原来的项目很复杂,但我写了一个小演示,说明了问题和我的问题。
我的模型包含一个对象列表。当我调用其方法increment()
时,它将应用于当前所选项目。我的问题是如何跟踪当前选择的项目?
下面的代码使用指针currentItem
来跟踪当前所选项目。
但我的真实项目通过命令模式执行/撤消功能,因此需要跟踪。此外,我在那里有更多的状态来跟踪包括当前所选项目和之前选择的项目。
除了下面的代码,我已经尝试过状态设计模式,但是我必须在适用于对象的策略中实现很多函数,并且似乎使事情变得复杂。这有特定的模式吗?策略是否适合这里或者是一种矫枉过正或者简单的普通指针方法是否合适?请记住,我的应用程序需要支持执行/撤消功能。
#include <QCoreApplication>
#include <iostream>
#include <QList>
#define ITEM_COUNT 5
using namespace std;
class ObjectA {
public:
ObjectA(string n, int p) {
name = n;
price = p;
}
string name;
int price;
void increment() {
price++;
}
};
class ContainerObject
{
public:
QList<ObjectA*> items;
ContainerObject() {
for (int i = 0; i < ITEM_COUNT; i++)
{
string name = ("name " + std::to_string((_ULonglong)i));
ObjectA * item = new ObjectA(name, 0);
items.append( item );
}
// assume at index 3 is current item
setCurrentItem( items.at(2) );
}
ObjectA* currentItem;
void setCurrentItem(ObjectA * obj) {
currentItem = obj;
}
void increment(){
currentItem->increment();
if( currentItem->price >= 2)
setCurrentItem( items.at( 4) );
}
void print()
{
for (int i = 0; i < ITEM_COUNT; i++)
{
ObjectA * item = items.at( i );
cout << item->name << " " << item->price << " added" << endl;
}
cout << endl;
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
ContainerObject container;
// initial values
container.print();
container.increment();
container.print();
container.increment();
container.print();
container.increment();
container.print();
return a.exec();
}
答案 0 :(得分:1)
首先,您似乎有多个已打开的问题:
1)您应该如何跟踪所选项目?
没有好的答案取决于你的容器的类型。这里似乎有一个列表,然后指针方法与索引方法相比更适合,因为元素的数量可以变化(您可以插入/追加新项目)不同的地点)
2)关于实现这一目标的模式类型?
我还没有理解为什么你试图实现状态设计模式,我假设因为你读了这个假设&#34;它允许在内部时调整对象的行为国家变化&#34;。我认为更改所选项目并不代表内部状态变化&#34;然后它不合适。它通常用于状态机实现。
对于撤消/做的特定目的,有一种称为纪念设计模式的模式,它可以回忆一些重要的事情,例如之前选择的项目左右,并允许您恢复情况。我想在收到命令时可以简化你的设计:
如果需要撤消命令: