/* 设计模式 23种 */
/* 开放封闭原则: 类的改动 是通过增加代码来实现的 不是修改源代码 */
/* 比如一个类 实现了各种功能 但是后期想修改某个功能就很难 那我们把它写成纯虚函数 让继承的类去实现 */
#include <iostream>
#include <windows.h>
using namespace std;
/*class Bankworker//一开始的想法 一个类实现多个操作
{
public:
void savemoney()
{
cout << " savemoney " << endl;
}
void getmoney()
{
cout << " getmoney " << endl;
}
void transformmoney()
{
cout << " transformmoney " << endl;
}
};*/
class Bankworker//把这个类函数变成 纯虚函数
{
public:
/*virtual void savemoney() = 0;
virtual void getmoney() = 0;
virtual void transformmoney() = 0;*/
virtual void work() = 0;
};
class Savework : public Bankworker//继承的类进行实现 savemoney
{
public:
void work()
{
cout << " savemoney " << endl;
}
};
class Getwork : public Bankworker//继承的类进行实现 getmoney
{
public:
void work()
{
cout << " getmoney " << endl;
}
};
class transformwork : public Bankworker//继承的类进行实现 transformmoney
{
public:
void work()
{
cout << " transformmoney " << endl;
}
};
int main()
{
/*Bankworker *b1 = new Bankworker;
b1->getmoney();
b1->savemoney();*/
Bankworker *b1 = NULL;
b1 = new Savework;
b1->work();
b1 = new Getwork;
b1->work();
b1 = new transformwork;
b1->work();
system("pause");
return 0;
}
/* 依赖倒置原则 : */
/*
#include <iostream>
#include <windows.h>
using namespace std;
class Ram2G
{
public:
void Ramwork()
{
cout << "Ramwork 2G" << endl;
}
};
class Rom32G
{
public:
void Romwork()
{
cout << "Romwork 32G" << endl;
}
};
class Phone//依赖于实现
{
private:
Ram2G *Ra;
Rom32G *Ro;
public:
Phone(Ram2G *a, Rom32G *b)
{
Ra = a;
Ro = b;
}
void Phonework()
{
Ra->Ramwork();
Ro->Romwork();
}
};
int main()
{
Ram2G *Ra2 = new Ram2G;
Rom32G *Ro32 = new Rom32G;
Phone *p = new Phone(Ra2, Ro32);
p->Phonework();
system("pause");
return 0;
}
*/
#include <iostream>
#include <windows.h>
using namespace std;
class Ram
{
public:
virtual void Ramwork() = 0;
};
class Ram2G : public Ram
{
public:
void Ramwork()
{
cout << "Ramwork 2G" << endl;
}
};
class Ram4G : public Ram
{
public:
void Ramwork()
{
cout << "Ramwork 4G" << endl;
}
};
class Rom
{
public:
virtual void Romwork() = 0;
};
class Rom32G : public Rom
{
public:
void Romwork()
{
cout << "Romwork 32G" << endl;
}
};
class Rom64G : public Rom
{
public:
void Romwork()
{
cout << "Romwork 64G" << endl;
}
};
class Phone
{
private:
Ram *Ra;
Rom *Ro;
public:
Phone(Ram *a, Rom *b)
{
Ra = a;
Ro = b;
}
void Phonework()
{
Ra->Ramwork();
Ro->Romwork();
}
};
int main()
{
/*Ram *Ra = new Ram2G;
Rom *Ro = new Rom32G;
Phone *p = new Phone(Ra, Ro);
p->Phonework();
delete Ra;
delete Ro;
delete p;*/
Ram *Ra1 = new Ram4G;
Rom *Ro1 = new Rom64G;
Phone *p1 = new Phone(Ra1, Ro1);
p1->Phonework();
delete Ra1;
delete Ro1;
delete p1;
system("pause");
return 0;
}
/* 工厂模式 */
#include <iostream>
#include <windows.h>
#include <stdlib.h>
using namespace std;
class car
{
public:
virtual void show() = 0;
};
class benz : public car
{
public:
void show()
{
cout << "benz" << endl;
}
};
class baoma : public car
{
public:
void show()
{
cout << "baoma" << endl;
}
};
class carfactory
{
public:
virtual car * showcar() = 0;
};
class factorybaoma :public carfactory
{
public:
car * showcar()
{
return new baoma;
}
};
class factorybenz :public carfactory
{
public:
car * showcar()
{
return new benz;
}
};
int main()
{
carfactory *f = new factorybaoma;
f->showcar()->show();
delete f;
system("pause");
return 0;
}
/* 抽象工厂 */
#include <iostream>
#include <windows.h>
#include <stdlib.h>
using namespace std;
class fruit
{
public :
virtual void show() = 0;
};
class Northapple : public fruit
{
public:
void show()
{
cout << " Northapple " << endl;
}
};
class Northpear : public fruit
{
public:
void show()
{
cout << " Northpear " << endl;
}
};
class Sorthapple : public fruit
{
public:
void show()
{
cout << " Sorthapple " << endl;
}
};
class Sorthpear : public fruit
{
public:
void show()
{
cout << " Sorthpear " << endl;
}
};
class factory
{
public:
virtual fruit *createapple() = 0;
virtual fruit *createpear() = 0;
};
class Northfactory : public factory
{
public:
fruit *createapple()
{
return new Northapple;
}
fruit *createpear()
{
return new Northpear;
}
};
class Sorthfactory : public factory
{
public:
fruit *createapple()
{
return new Sorthapple;
}
fruit *createpear()
{
return new Sorthpear;
}
};
int main()
{
factory *n1 = new Northfactory;
n1->createapple()->show();
n1->createpear()->show();
delete n1;
factory *n2 = new Sorthfactory;
n2->createapple()->show();
n2->createpear()->show();
delete n2;
system("pause");
return 0;
}
/* 建造者模式 */
#include <iostream>
#include <windows.h>
#include <stdlib.h>
#include <string>
using namespace std;
class house
{
private:
string wall;
string door;
string window;
public:
void setwall(string w)
{
wall = w;
}
void setdoor(string d)
{
door = d;
}
void setwindow(string wi)
{
window = wi;
}
string getwall()
{
return wall;
}
string getdoor()
{
return door;
}
string getwindow()
{
return window;
}
};
class builder
{
private:
house *h;
public:
builder()
{
h = new house;
}
void constuctor()
{
h->setdoor("door");
h->setwall("wall");
h->setwindow("window");
}
void getinfo()
{
cout << h->getdoor() << endl;
cout << h->getwall() << endl;
cout << h->getwindow() << endl;
}
};
int main()
{
builder *b1 = new builder;
b1->constuctor();
b1->getinfo();
system("pause");
return 0;
}
/* 建造者模式改良版 */
#include <iostream>
#include <windows.h>
#include <stdlib.h>
#include <string>
using namespace std;
class house
{
private:
string wall;
string door;
string window;
public:
void setwall(string w)
{
wall = w;
}
void setdoor(string d)
{
door = d;
}
void setwindow(string wi)
{
window = wi;
}
string getwall()
{
return wall;
}
string getdoor()
{
return door;
}
string getwindow()
{
return window;
}
};
class builder
{
private:
house *h;
public:
virtual void constuctor() = 0;
virtual void getinfo() = 0;
};
class buildernormal : public builder
{
private:
house *h;
public:
buildernormal()
{
h = new house;
}
void constuctor()
{
h->setdoor("doornormal");
h->setwall("wallnormal");
h->setwindow("windownormal");
}
void getinfo()
{
cout << h->getdoor() << endl;
cout << h->getwall() << endl;
cout << h->getwindow() << endl;
}
};
class buildervilla : public builder
{
private:
house *h;
public:
buildervilla()
{
h = new house;
}
void constuctor()
{
h->setdoor("doorvilla");
h->setwall("wallvilla");
h->setwindow("windowvilla");
}
void getinfo()
{
cout << h->getdoor() << endl;
cout << h->getwall() << endl;
cout << h->getwindow() << endl;
}
};
int main()
{
builder *b = new buildernormal;
b->constuctor();
b->getinfo();
builder *b1 = new buildervilla;
b1->constuctor();
b1->getinfo();
system("pause");
return 0;
}
/* 原型模式 */
#include <iostream>
using namespace std;
class Person
{
protected:
string name;
public:
Person()
{
}
Person(string n)
{
name = n;
}
string GetName()
{
return name;
}
virtual void show() = 0;
virtual Person *clone() = 0;
};
class Student : public Person
{
private:
int id;
public:
Student()
{
}
Student(string n, int i) : Person(n)
{
id = i;
}
void show()
{
cout << name << " " << id << endl;
}
Person *clone()
{
Student *tmp = new Student;
*tmp = *this;
return tmp;
}
};
int main()
{
Person *s1 = new Student("aa", 1);
s1->show();
Person *s2 = s1->clone();
s2->show();
return 0;
}
/* 组合模式 */
#include <iostream>
#include <list>
using namespace std;
class BaseFile
{
public:
virtual string GetName() = 0;
virtual int Add(BaseFile *file) = 0;
virtual int Remove(BaseFile *file) = 0;
virtual list<BaseFile *> *GetChild() = 0;
};
class IFile : public BaseFile
{
private:
string name;
public:
IFile(string n)
{
name = n;
}
string GetName()
{
return name;
}
int Add(BaseFile *file)
{
return -1;
}
int Remove(BaseFile *file)
{
return -1;
}
list<BaseFile *> *GetChild()
{
return NULL;
}
};
class Dir : public BaseFile
{
private:
string name;
list<BaseFile *> *l;
public:
Dir(string n)
{
name = n;
l = new list<BaseFile *>;
}
string GetName()
{
return name;
}
int Add(BaseFile *file)
{
l->push_back(file);
return 1;
}
int Remove(BaseFile *file)
{
l->remove(file);
return 1;
}
list<BaseFile *> *GetChild()
{
return l;
}
};
void show(BaseFile *root, int gap)
{
for (int i = 0; i < gap; i++)
{
cout << "---";
}
if (root != NULL)
{
cout << root->GetName() << endl;
}
else
{
return;
}
list<BaseFile *> *l = root->GetChild();
if (l != NULL)
{
for (list<BaseFile *>::iterator it = l->begin(); it != l->end(); it++)
{
show((*it), gap + 1);
}
}
}
int main()
{
BaseFile *root = new Dir("root");
BaseFile *dir1 = new Dir("home");
BaseFile *file1 = new IFile("1.c");
BaseFile *file2 = new IFile("2.c");
BaseFile *file3 = new IFile("3.c");
BaseFile *file4 = new IFile("4.c");
BaseFile *file5 = new IFile("5.c");
BaseFile *dir2 = new Dir("hello");
dir1->Add(file1);
dir1->Add(file2);
dir1->Add(file3);
dir1->Add(file4);
dir1->Add(file5);
dir2->Add(file1);
dir2->Add(file2);
dir2->Add(file3);
dir2->Add(file4);
dir2->Add(file5);
root->Add(dir1);
root->Add(dir2);
/*list<BaseFile *> *l = dir1->GetChild();
for (list<BaseFile *>::iterator it = l->begin(); it != l->end(); it++)
{
cout << (*it)->GetName() << endl;
}*/
show(root, 0);
return 0;
}