1、原型模式
#include <iostream>
#include <string>
using namespace std;
//原型模式---->处理拷贝问题,在内部加入克隆函数
class Person
{
public:
virtual void show() = 0;
virtual Person *clon() = 0;
};
class Woker:public Person
{
public:
Woker(int id = 1,string name = "小白")
{
this->name = name;
this->id = id;
}
void show()
{
cout<<"id = "<<id<<",name = "<<name<<endl;
}
Person *clon()//浅克隆
{
Woker *w = new Woker;
*w = *this;
return w;
}
private:
int id;
string name;
};
void func(Person *p)
{
Person *w = p;
w->clon();
w->show();
}
int main()
{
Woker w1;
func(&w1);
return 0;
}
2、代理模式
#include <iostream>
using namespace std;
//代理模式
class Person
{
public:
virtual void find_home() = 0;
virtual void sign() = 0;
virtual void pay() = 0;
virtual void live() = 0;
};
class Myself:public Person
{
public:
virtual void find_home()
{
cout<<"自己找房子"<<endl;
}
virtual void sign()
{
cout<<"自己签合同"<<endl;
}
virtual void pay()
{
cout<<"自己付钱"<<endl;
}
virtual void live()
{
cout<<"自己住"<<endl;
}
};
class Proxy:public Person
{
public:
Proxy(Person *m)
{
this->m = m;
}
virtual void find_home()
{
cout<<"中介找房子"<<endl;
}
virtual void sign()
{
cout<<"中介签合同"<<endl;
}
virtual void pay()
{
m->pay();
}
virtual void live()
{
m->live();
}
private:
Person *m;
};
int main()
{
Person *m = new Myself;
m->find_home();
m->sign();
m->pay();
m->live();
cout<<"-----------------------------------"<<endl;
Person *p = new Proxy(m);
p->find_home();
p->sign();
p->pay();
p->live();
return 0;
}
3、装饰模式
#include <iostream>
using namespace std;
//装饰模式
class Bicycle
{
public:
virtual void show() = 0;
};
//基础车
class Runbicycle:public Bicycle
{
public:
void show()
{
cout<<"老司机的小自行车"<<endl;
}
};
//模块
class Decorator:public Bicycle
{
public:
virtual void add() = 0;
protected:
Bicycle *b;
};
//模块实现
class fly:public Decorator
{
public:
fly(Bicycle *b)
{
this->b = b;
}
void show()
{
b->show();
add();
}
void add()
{
cout<<"安装飞行装置"<<endl;
}
};
class swim:public Decorator
{
public:
swim(Bicycle *b)
{
this->b = b;
}
void show()
{
b->show();
add();
}
void add()
{
cout<<"安装潜水装置"<<endl;
}
};
int main3()
{
Bicycle *b = new Runbicycle;
b->show();
cout<<"---------------"<<endl;
Decorator *d1 = new fly(b);
d1->show();
cout<<"---------------"<<endl;
Decorator *d2 = new swim(d1);
d2->show();
cout<<"---------------"<<endl;
Decorator *d3 = new swim(b);
d3->show();
return 0;
}
4、适配器模式
#include <iostream>
using namespace std;
//适配器模式
class P5V
{
public:
virtual void use() = 0;
};
class P220V
{
public:
void use()
{
cout <<"使用220v电压"<<endl;
}
};
class adapter:public P5V
{
public:
adapter(P220V *p)
{
this->p = p;
}
void use()
{
p->use();
cout<<"经过转换,将220V电压转换成5V电压,对外提供"<<endl;
}
private:
P220V *p;
};
int main()
{
P220V *p = new P220V;
P5V *use = new adapter(p);
use->use();
return 0;
}
5、桥接模式
#include <iostream>
using namespace std;
class Colour
{
public:
virtual void full() = 0;
};
class Red:public Colour
{
public:
void full()
{
cout<<"填充红色"<<endl;
}
};
class Bule:public Colour
{
public:
void full()
{
cout<<"填充蓝色"<<endl;
}
};
class Black:public Colour
{
public:
void full()
{
cout<<"填充黑色"<<endl;
}
};
class white:public Colour
{
public:
void full()
{
cout<<"填充白色"<<endl;
}
};
//图形
class Graph
{
public:
void setcolour(Colour *c = nullptr)
{
this->c = c;
}
virtual void show() = 0;
protected:
Colour *c;
};
class Triangle:public Graph
{
void show()
{
cout<<"画了一个三角形"<<endl;
if(c != nullptr)
c->full();
}
};
class Ellipse:public Graph
{
void show()
{
cout<<"画了一个椭圆"<<endl;
if(c != nullptr)
c->full();
}
};
int main()
{
Colour *c1 = new Red;
Colour *c2 = new Bule;
Colour *c3 = new Black;
Graph *t = new Triangle;
Graph *e = new Ellipse;
//椭圆
e->setcolour();
e->show();
e->setcolour(c1);
e->show();
e->setcolour(c2);
e->show();
e->setcolour(c3);
e->show();
//三角形
t->setcolour(c1);
t->show();
t->setcolour(c2);
t->show();
t->setcolour(c3);
t->show();
return 0;
}
6、组合模式
#include <iostream>
#include <string>
#include <list>
using namespace std;
//组合模式
//文件(目录,普通文件)基类
class IFile
{
public:
virtual ~IFile()
{
}
virtual void Show() = 0;
virtual void Add(IFile *) = 0;
virtual void Delet(IFile *) = 0;
virtual list<IFile *> *GetRoute() = 0;
virtual string getname() = 0;
protected:
string name;
};
//普通文件
class File:public IFile
{
public:
File(string name)
{
this->name = name;
}
virtual void Show()
{
cout<<name<<endl;
}
virtual void Add(IFile *file)
{
return;
}
virtual void Delet(IFile *file)
{
return;
}
virtual list<IFile *> *GetRoute()
{
return nullptr;
}
string getname()
{
return name;
}
};
//目录文件
class Catalog:public IFile
{
public:
Catalog(string name)
{
l = new list<IFile *>;
this->name = name;
}
~Catalog()
{
if(l != nullptr)
{
while(!l->empty())
{
delete *(l->begin());
l->erase(l->begin());
}
delete l;
l = nullptr;
}
}
virtual void Show()
{
cout<<name<<endl;
}
virtual void Add(IFile *file)
{
l->push_back(file);
}
virtual void Delet(IFile *file)
{
l->remove(file);
}
virtual list<IFile *> *GetRoute()
{
return l;
}
string getname()
{
return name;
}
private:
list<IFile *> *l;
};
/*
D盘
电影
大黄蜂.mp4
死侍.mp4
新喜剧之王.mp4
哈利波特
哈利波特1.mp4
哈利波特3.mp4
哈利波特7.mp4
学习
面试宝典.paf
剑指offer.pdf
游戏
仙剑奇侠传
仙剑奇侠传1.exe
仙剑奇侠传2.exe
仙剑奇侠传3.exe
魂斗罗.exe
超级玛丽.exe
*/
bool compare(IFile *left,IFile *right)
{
return (left->getname() < right->getname());
}
void func(IFile *f)
{
IFile *study = new Catalog("学习");
IFile *game = new Catalog("游戏");
IFile *film = new Catalog("电影");
IFile *d4 = new Catalog("哈利波特");
IFile *g1 = new Catalog("仙剑奇侠传");
IFile *d1 = new File("大黄蜂.mp4");
IFile *d2 = new File("死侍.mp4");
IFile *d3 = new File("新喜剧之王.mp4");
IFile *d41 = new File("哈利波特1.mp4");
IFile *d42 = new File("哈利波特3.mp4");
IFile *d43 = new File("哈利波特7.mp4");
IFile *s1 = new File("面试宝典.paf");
IFile *s2 = new File("剑指offer.pdf");
IFile *g11 = new File("仙剑奇侠传1.exe");
IFile *g12 = new File("仙剑奇侠传2.exe");
IFile *g13 = new File("仙剑奇侠传3.exe");
IFile *g2 = new File("魂斗罗.exe");
IFile *g3 = new File("超级玛丽.exe");
f->Add(film);
f->Add(study);
f->Add(game);
film->Add(d1);
film->Add(d2);
film->Add(d3);
film->Add(d4);
d4->Add(d41);
d4->Add(d42);
d4->Add(d43);
study->Add(s1);
study->Add(s2);
game->Add(g1);
g1->Add(g11);
g1->Add(g12);
g1->Add(g13);
game->Add(g2);
game->Add(g3);
}
void show(IFile *f,int count)
{
for(int i = 0;i < count;i++)
cout<<"....";
f->Show();
list<IFile *> *mlist = f->GetRoute();
if(mlist != nullptr)
{
mlist->sort(compare); //从 小到大排序
list<IFile *>::iterator it = mlist->begin();
while(it != mlist->end())
{
show(*it,count+1);
it++;
}
}
}
int main()
{
IFile *f = new Catalog("D盘");
func(f);
show(f,0);
return 0;
}
7、观察者模式
#include <iostream>
#include <string>
#include <list>
using namespace std;
class Observer;
//通知者
class Obsecretary
{
public:
virtual void add(Observer *) = 0;
virtual void rm(Observer*) = 0;
virtual void notify(string info) = 0;
};
//观察者
class Observer
{
public:
virtual void reg(Obsecretary *) = 0;
virtual void cancel(Obsecretary *) = 0;
virtual void updata(string info) = 0;
};
class PlayGame:public Observer
{
public:
virtual void reg(Obsecretary *o)
{
o->add(this);
}
virtual void cancel(Obsecretary *o)
{
o->rm(this);
}
virtual void updata(string info)
{
if(info == "老板来了")
cout<<"关掉游戏"<<endl;
else if(info == "老板走了")
cout<<"打开游戏"<<endl;
}
};
class WitchTV:public Observer
{
public:
virtual void reg(Obsecretary *o)
{
o->add(this);
}
virtual void cancel(Obsecretary *o)
{
o->rm(this);
}
virtual void updata(string info)
{
if(info == "老板来了")
cout<<"关掉电视"<<endl;
else if(info == "老板走了")
cout<<"打开电视"<<endl;
}
};
class Secretary:public Obsecretary
{
public:
virtual void add(Observer *o)
{
l.push_back(o);
}
virtual void rm(Observer* o)
{
l.remove(o);
}
virtual void notify(string info)
{
for(list<Observer *>::iterator it = l.begin();it != l.end();it++)
{
(*it)->updata(info);
}
}
private:
list<Observer *> l;
};
int main()
{
Observer *p1 = new PlayGame;
Observer *p2 = new WitchTV;
Obsecretary *p = new Secretary;
p1->reg(p);
p2->reg(p);
cout<<"老板来了--------------"<<endl;
p->notify("老板来了");
cout<<"老板走了--------------"<<endl;
p->notify("老板走了");
return 0;
}