结构型模式包括:
1、代理模式:
(1)Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问。所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而 代理一般在交互的过程中(交互前后),进行某些特别的处理。
(2)适用情况:为其他对象提供一种代理以控制对这个对象的访问。
2、装饰模式:
(1)装饰( Decorator )模式又叫做包装模式。通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端 就可以有选择地、按顺序地使用装饰功能包装对象。
(2)适用情况:装饰者模式动态的给一个对象添加一些额外的职责。就增加功能来说,此模式比生成子类更为灵活。
3、适配器模式:
(1)Adapter模式也叫适配器模式,是构造型模式之一,通过Adapter模式可以改变已有类(或外部类)的接口形式。
(2)适用情况:是将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一 起工作。
4、组合模式
(1)Composite模式也叫组合模式,是构造型的设计模式之一。通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树。
(2)适用情况:单个对象和组合对象的使用具有一致性。将对象组合成树形结构以表示“部分--整体”。
5、桥接模式
(1)bridge 模式又叫做桥接模式,是构造型的设计模式之一。Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来, 从而可以保持各部分的独立性以及应对它们的功能扩展。
(2)适用情况:桥接模式是将抽象部分与实现部分分离(解耦合),使它们都可以独立的变化。
6、外观模式
(1)Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。
(2)适用情况:为子系统中统一一套接口,让子系统更加容易使用。
7、享元模式
(1)Flyweight模式也叫享元模式,是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用。
(2)享元模式的提出:
(3)适用情况:是以共享的方式,高效的支持大量的细粒度的对象。
这里,用代码描述享元模式:
1 #include<iostream>
2 #include<map>
3 using namespace std;
4
5 class Student
6 {
7 private:
8 string name;
9 int age;
10 int id;
11 public:
12 Student(string n,int a,int i)
13 {
14 name = n;
15 age = a;
16 id = i;
17 }
18 string GetName()
19 {
20 return name;
21 }
22 int GetAge()
23 {
24 return age;
25 }
26 int GetId()
27 {
28 return id;
29 }
30 };
31
32 class FWFactory //享元模式
33 {
34 private:
35 multimap<int , Student *> *m; //m为野指针
36 public:
37 FWFactory()
38 {
39 m = new multimap<int , Student *>; //给m new一个对象
40 }
41
42 ~FWFactory()
43 {
44 while(!m->empty()) //若无这步 会造成内存泄漏
45 {
46 free(m->begin()->second); //释放掉value里的具体内容
47 m->erase(m->begin()); //删掉key的值
48 }
49 delete m; //释放map
50 }
51
52 Student *GetPerson(int id)
53 {
54 multimap<int , Student *>::iterator it;
55
56 it = m->find(id);
57 if(it == m->end())
58 {
59 string name;
60 int age;
61 cout<< "Please input info:" <<endl;
62 cin>> name >> age;
63
64 Student *tmp = new Student(name , age , id);
65 m->insert(make_pair(id , tmp));
66
67 return tmp;
68 }
69 else
70 {
71 Student *tmp = it->second;
72 cout<< tmp->GetName() <<" "<< tmp->GetAge() <<" "<< tmp->GetId() <<endl;
73 }
74 }
75 };
76
77 int main()
78 {
79 FWFactory *f = new FWFactory;
80
81 f->GetPerson(1);
82 f->GetPerson(2);
83 f->GetPerson(3);
84 f->GetPerson(4);
85 f->GetPerson(5);
86 f->GetPerson(6);
87 f->GetPerson(1);
88
89 delete f;
90
91 return 0;
92 }