学习笔记:组合模式
模式简介
:属于结构性模式,创建了对象组的树形结构,又叫部分整体模式。
为什么用
:当一堆对象具有层次关系,功能又相似时,不写成树的结构怎么说的过去呢?
怎么样用
:就像数据结构中的n叉树,写一个类,类里有一个存放这个类指针的数组或者集合,这样通过一个头类?!就可以访问它数组里的其他类,而其他类可以访问自己数组里放的类。这就实现多级管理的效果。
注意事项
:可以在类增加一个指向父类的指针,方便从基层到高层。
实际举例
:游戏多级菜单的实现。
#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
using namespace std;
//游戏指令
class Order {
private:
string name;
Order* parent;
vector<Order*>v;
public:
Order(string _name) {
this->name = _name;
}
void add(Order* o) {
o->parent = this;
v.push_back(o);
}
int showOrder() {
int size = v.size();
cout <<setw(25)<<left<< "当前菜单:["+ name +"] "<<"\n可用指令:\n";
for (int i = 0; i < size; ++i) {
cout <<i+1<<" "<< v[i]->name << " ";
};
return size;
}
string getName() {
return name;
}
Order* getParent() {
return parent;
}
vector<Order*>getOrder() {
return v;
}
};
int main()
{
//初始化菜单
Order* order1 = new Order("主菜单");
Order* order2 = new Order("人物");
Order* order3 = new Order("地图");
Order* order4 = new Order("战斗");
Order* order5 = new Order("背包");
Order* order6 = new Order("属性");
Order* order7 = new Order("技能");
Order* order8 = new Order("移动");
Order* order9 = new Order("交互");
Order* order10 = new Order("攻击");
Order* order11 = new Order("防御");
Order* order12 = new Order("查看");
Order* order13 = new Order("丢弃");
//按结构关系建立层级
order1->add(order2); order1->add(order3); order1->add(order4); order1->add(order5);
order2->add(order6); order2->add(order7);
order3->add(order8); order3->add(order9);
order4->add(order10); order4->add(order11);
order5->add(order12); order5->add(order13);
//循环,实现游戏菜单功能
Order* start= order1;
string path="主菜单";
while (1) {
cout << "当前路径:[" << path << "]\n";
int sum=start->showOrder();
cout << 0<<" 返回上一级\n";
string id;
cin >> id;
if (stoi(id) == 0) {
if (start->getParent() != NULL) {
int size = start->getName().size();
path = path.substr(0, path.size()-size-1);
start = start->getParent();
}
else {
;
}
}
else if (1<=stoi(id)&&stoi(id)<= sum){
start = start->getOrder()[stoi(id)-1];
path = path + "/" + start->getName();
}
else {
;
}
system("CLS");
}
return 0;
}