// ConsoleApplication30.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
include
include
using namespace std;
//
class fontFactory;
class font
{
private:
std::string key;
public:
font(const std::string& key ):key(key)
{
}
};
class fontFactory
{
map footpool;
public:
font * getfont(const string &key)
{
map::iterator it = footpool.find(key);
if (it != footpool.end())
{
return footpool[key];
}
else
{
font* font = new ::font(key);
footpool[key] = font;
return font;
}
}
};
int main()
{
std::cout << "Hello World!\n";
}
// expressionPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
include
include
include
using namespace std;
class expression
{
public:
virtual int interperet(std::map var)
{};
private:
};
class varexpression : public expression
{
string m_key;
public:
varexpression(string key): m_key(key)
{
}
virtual int interperet(std::map<std::string, int> var)
{
return var[m_key];
}
};
class symbolExpression : public expression
{
public:
expression* left;
expression* right;
symbolExpression(expression* l, expression* r):
left(l), right(r)
{
}
expression* getleft() { return left; }
expression* getright() { return right; }
};
class addExpression : public symbolExpression
{
public:
addExpression(expression* l, expression* r) : symbolExpression(l, r)
{
}
};
class subExpression : public symbolExpression
{
public:
subExpression(expression* l, expression* r) : symbolExpression(l, r)
{
}
};
class calculator
{
public:
expression* m_expression;
calculator(string ex)
{
m_expression = nullptr;
stack<expression*> strexp;
expression* right;
expression* left;
for (int i = 0; ex.length(); i++)
{
switch (ex[i])
{
case '+':
left = strexp.top();
strexp.pop();
right = new varexpression(ex.substr(++i, 1));
strexp.push(new addExpression(left, right));
break;
case '-':
left = strexp.top();
strexp.pop();
right = new varexpression(ex.substr(++i, 1));
strexp.push(new subExpression(left, right));
break;
default:
strexp.push(new varexpression(ex.substr(i, 1)));
}
}
if(!strexp.empty())
{
//m_expression = strexp.pop();
strexp.pop();
}
}
int runing(map<string, int>& val)
{
return (m_expression == nullptr) ? 0 : m_expression->interperet(val);
}
};
int main()
{
}
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
include
include
include
using namespace std;
struct ShareState
{
string m_brand;
string m_model;
string m_color;
ShareState(const string& brand,
const string model, const string color):m_brand(brand),m_model(model),m_color(color)
{
}
friend ostream& operator<<(ostream& os, const ShareState& ss)
{
return os << ss.m_brand <<"\t"<< ss.m_color << "\t"<<ss.m_model<<"\n";
}
};
struct uniqueState
{
string m_owner;
string m_plate;
uniqueState(const string& owner, const string& plate)
: m_owner(owner), m_plate(plate)
{
}
//toString
friend ostream& operator<<(ostream& os, const uniqueState& ss)
{
return os << ss.m_owner <<"\t"<< ss.m_plate<<"\n";
}
};
//flyweight
class flyweight
{
private:
ShareState m_shareState;
public:
flyweight(const ShareState shares_state)
: m_shareState(shares_state)
{
}
void operation(uniqueState unique)
{
cout <<"\n"<<"waibu" << "\t" <<m_shareState << "neibu" << unique;
}
};
class FlyweightFactory
{
unordered_map m_flyweigt;
public:
string getKey(const ShareState& ss)
{
return ss.m_brand + " -" + ss.m_color + "-" + ss.m_model;
}
FlyweightFactory(initializer_list<ShareState> share_states)
{
for (auto& ss : share_states)
{
m_flyweigt.insert({getKey(ss), flyweight(ss)});
}
}
flyweight* getFlyweight(const ShareState& share_state)
{
string key = getKey(share_state);
if (m_flyweigt.find(key) == m_flyweigt.end())
{
std::cout << "not find";
m_flyweigt.insert({key, share_state});
}
else
{
cout << "find";
}
return &m_flyweigt.at(key);
}
void listflyw() const
{
int count = m_flyweigt.size();
std::cout << "has" <<count;
for (pair<string, flyweight> it : m_flyweigt)
{
cout << it.first << "\n";
}
}
};
class CarInfo
{
private:
flyweight* m_flyweight_ = nullptr;
uniqueState* m_unique_state_;
public:
CarInfo(flyweight* flyweight, uniqueState* unique_state)
: m_flyweight_(flyweight), m_unique_state_(unique_state)
{
}
void operation()
{
m_flyweight_->operation(*m_unique_state_);
}
};
include
class policeDatabase
{
private:
list car_infos_;
public:
~policeDatabase()
{
for (auto item : car_infos_)
{
delete item;
}
}
void addcartoPolicedatabase(FlyweightFactory& ff, const string& woner, const string& plate, const string& brand,
const string& color, const string& model)
{
flyweight* flyweight = ff.getFlyweight({brand, model, color});
uniqueState unique_state(woner, plate);
car_infos_.push_back(new CarInfo(flyweight, &unique_state));
for (auto item : car_infos_)
item->operation();
}
};
int main()
{
FlyweightFactory factory({
ShareState("an", "ax", "red"),
ShareState("ax", "ddd", "ff")
});
cout << "\n----------------------------------\n";
factory.listflyw();
cout << "\n----------------------------------\n";
policeDatabase database;
database.addcartoPolicedatabase(factory, "xx", "xx", "xx", "xx", "xx");
cout << "\n----------------------------------\n";
factory.listflyw();
cout << "\n----------------------------------\n";
database.addcartoPolicedatabase(factory, "yy", "yy", "an", "ay", "red");
cout << "\n----------------------------------\n";
factory.listflyw();
cout << "\n----------------------------------\n";
database.addcartoPolicedatabase(factory, "zz", "zz", "an", "ay", "red");
cout << "\n----------------------------------\n";
factory.listflyw();
}
// ConsoleApplication2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/**
include
class a
{
public:
};
class b:public a
{
public:
};
int main()
{
int* p;
if(typeid(int*)==typeid(p))
{
std::cout << "equal";
}
a x;
a y;
if(typeid(x)!=typeid(y))
{
std::cout << "not ii";
}
}*/
include
using namespace std;
class A;
class B;
class C;
class D;
class E;
class Base
{
public:
class IVisitor
{
public:
virtual void visit(A*) = 0;
virtual void visit(B*) = 0;
virtual void visit(C*) = 0;
virtual void visit(D*) = 0;
virtual void visit(E*) = 0;
};
virtual void say() = 0;
virtual void accept(IVisitor*) = 0;
virtual ~Base()
{
}
};
class A : public Base
{
public:
void say() override
{
cout << "Class A" << endl;
}
void accept(IVisitor* vis) override
{
vis->visit(this); // 匹配数据操作类中的重载函数
}
};
class B : public Base
{
public:
void say() override
{
cout << "Class B" << endl;
}
void accept(IVisitor* vis) override
{
vis->visit(this);
}
};
class C : public Base
{
public:
void say() override
{
cout << "Class C" << endl;
}
void accept(IVisitor* vis) override
{
vis->visit(this);
}
};
class D : public Base
{
public:
void say() override
{
cout << "Class D" << endl;
}
void accept(IVisitor* vis) override
{
vis->visit(this);
}
};
class E : public Base
{
public:
void say() override
{
cout << "Class E" << endl;
}
void accept(IVisitor* vis) override
{
vis->visit(this);
}
};
class calcVisitor : public Base::IVisitor
{
// 数据操作类
public:
calcVisitor(int& x) : x(x)
{
}
void visit(A* obj) override
{
x *= 2;
}
void visit(B* obj) override
{
x -= 3;
}
void visit(C* obj) override
{
x += 6;
}
void visit(D* obj) override
{
x /= 3;
}
void visit(E* obj) override
{
x -= 2;
}
private:
int& x;
};
int main()
{
// 访问者模式实现, 类型->功能(补充知识: 解决新增功能维护难——通过让编译器提示改代码)
srand(time(0));
Base* p[5] = {nullptr};
for (int i = 0; i < 5; ++i)
{
// 第一次类指针类型转换
switch (rand() % 5)
{
case 0: p[i] = new A();
break;
case 1: p[i] = new B();
break;
case 2: p[i] = new C();
break;
case 3: p[i] = new D();
break;
case 4: p[i] = new E();
break;
}
}
int x = 1;
calcVisitor vis(x);
for (int i = 0, pre = x; i < 5; ++i)
{
p[i]->accept(&vis); // 第二次类指针类型转换
p[i]->say();
cout << pre << " -> " << x << endl;
pre = x;
}
return 0;
}
//// ConsoleApplication31.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
////
//
//#include
//class a
//{
//public:
// a(int m,int n):i(m),j(n){}
// int i;
// int j;
// void print()
// {
// std::cout << "Hello World!\n";
//
// }
//};
//void fun(std::shared_ptr f)
//{
//}
//
//int main()
//{
// std::unique_ptr f(new a(2, 4));
// f->print();
// fun(std::make_shared(3, 4));
// std::shared_ptr dd = std::make_shared(2, 3);
// std::shared_ptr ff = dd;
//
// std::cout << (*ff).i;
//}
//
//// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
//// 调试程序: F5 或调试 >“开始调试”菜单
//
//// 入门使用技巧:
//// 1. 使用解决方案资源管理器窗口添加/管理文件
//// 2. 使用团队资源管理器窗口连接到源代码管理
//// 3. 使用输出窗口查看生成输出和其他消息
//// 4. 使用错误列表窗口查看错误
//// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
include
include
include
class AbstractHero {
public:
virtual void showStatus() = 0;
int mHp, mMp, mAt, mDf;
};
class HeroA :public AbstractHero {
public:
HeroA() {
mHp = 0, mMp = 0, mAt = 0, mDf = 0;
}
virtual void showStatus() {
std::cout << "血量:" << mHp << std::endl;
std::cout << "魔法:" << mMp << std::endl;
std::cout << "攻击:" << mAt << std::endl;
std::cout << "防御:" << mDf << std::endl;
}
};
//英雄穿上某个装饰物,那么也还是一个英雄
class AbstractEquipment : public AbstractHero {
public:
AbstractEquipment(AbstractHero* hero) {
pHero = hero;
}
virtual void showStatus() {}
AbstractHero* pHero;
};
//给英雄穿上狂徒铠甲
class KuangtuEquipment :public AbstractEquipment {
public:
KuangtuEquipment(AbstractHero* hero) :AbstractEquipment(hero) {}
//增加新的功能
void AddKuangtu() {
std::cout << "新英雄穿上狂徒之后" << std::endl;
this->mHp = this->pHero->mHp;
this->mMp = this->pHero->mMp;
this->mAt = this->pHero->mAt;
this->mDf = this->pHero->mDf + 30;
}
virtual void showStatus() {
AddKuangtu();
std::cout << "血量:" << mHp << std::endl;
std::cout << "魔法:" << mMp << std::endl;
std::cout << "攻击:" << mAt << std::endl;
std::cout << "防御:" << mDf << std::endl;
}
};
int main() {
AbstractHero* hero = new HeroA;
hero->showStatus();
std::cout << "------------------------" << std::endl;
//给英雄穿上狂徒
hero = new KuangtuEquipment(hero);
hero->showStatus();
return 0;
}
// ConsoleApplication32.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
include
include
include
include
include
using namespace std;
//
class Company
{
public:
virtual string getInfo() = 0;
virtual string getName()
{
return name;
}
virtual string getType() = 0;
protected:
string name;
string position;
int salary;
};
class ConcreteCompany : public Company
{
public:
ConcreteCompany(string name, string position, int salary)
{
this->name = name;
this->position = position;
this->salary = salary;
}
void add(Company* company)
{
shared_ptr<Company> temp(company);
companyList.push_back(temp);
}
string getType()
{
return "ConcreteCompany";
}
void remove(string companyName)
{
list<shared_ptr<Company>>::iterator iter = companyList.begin();
for (; iter != companyList.end(); iter++)
{
if ((*iter).get()->getName() == companyName)
{
companyList.erase(iter);
return;
}
}
}
list<shared_ptr<Company>> getChildList()
{
return companyList;
}
string getInfo()
{
string info = "";
info = "名称:" + this->name;
info = info + "\t职位:" + this->position;
info = info + "\t薪水:" + to_string(this->salary);
return info;
}
private:
list> companyList;
};
class Employee : public Company
{
public:
Employee(string name, string position, int salary)
{
this->name = name;
this->position = position;
this->salary = salary;
}
string getType()
{
return "Employee";
}
string getInfo()
{
string info = "";
info = "名称:" + this->name;
info = info + "\t职位:" + this->position;
info = info + "\t薪水:" + to_string(this->salary);
return info;
}
};
void disPlay(ConcreteCompany* root)
{
cout << root->getInfo() << endl;
list> tmp = root->getChildList();
list>::iterator iter = tmp.begin();
for (; iter != tmp.end(); iter++)
{
if ((iter).get()->getType() == string("Employee"))
{
cout << (*iter).get()->getInfo() << endl;
}
else
{
//递归
disPlay((ConcreteCompany)(*iter).get());
}
}
}
int main()
{
ConcreteCompany* root = new ConcreteCompany("张三", "CEO", 100000);
ConcreteCompany* develop = new ConcreteCompany("李四", "研发组长", 100000);
ConcreteCompany* sale = new ConcreteCompany("王二", "销售组长", 100000);
Employee* e1 = new Employee("A", "研发", 200);
Employee* e2 = new Employee("B", "销售", 200);
Employee* e3 = new Employee("C", "研发", 200);
Employee* e4 = new Employee("D", "销售", 200);
root->add(develop);
root->add(sale);
develop->add(e1);
develop->add(e3);
sale->add(e2);
sale->add(e4);
disPlay(root);
develop->remove("A");
disPlay(root);
delete root;
root = NULL;
}
Top comments (0)