C++ 结构型模式

结构型模式包括:

一、代理模式:ios

(1)Proxy模式又叫作代理模式,是构造型的设计模式之一,它能够为其余对象提供一种代理(Proxy)以控制对这个对象的访问。所谓代理,是指具备与代理元(被代理的对象)具备相同的接口的类,客户端必须经过代理与被代理的目标类交互,而           代理通常在交互的过程当中(交互先后),进行某些特别的处理。设计模式

(2)适用状况:为其余对象提供一种代理以控制对这个对象的访问。spa

二、装饰模式:设计

(1)装饰( Decorator )模式又叫作包装模式。经过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当须要执行时,客户端               就能够有选择地、按顺序地使用装饰功能包装对象。代理

(2)适用状况:装饰者模式动态的给一个对象添加一些额外的职责。就增长功能来讲,此模式比生成子类更为灵活。指针

三、适配器模式:code

(1)Adapter模式也叫适配器模式,是构造型模式之一,经过Adapter模式能够改变已有类(或外部类)的接口形式。对象

(2)适用状况:是将一个类的接口转换成客户但愿的另一个接口。使得本来因为接口不兼容而不能一块儿工做的那些类能够一 起工做。blog

四、组合模式继承

(1)Composite模式也叫组合模式,是构造型的设计模式之一。经过递归手段来构造树形的对象结构,并能够经过一个对象来访问整个对象树。

(2)适用状况:单个对象和组合对象的使用具备一致性。将对象组合成树形结构以表示“部分--总体”。

五、桥接模式

(1)bridge 模式又叫作桥接模式,是构造型的设计模式之一。Bridge模式基于类的最小设计原则,经过使用封装,聚合以及继承等行为来让不一样的类承担不一样的责任。它的主要特色是把抽象(abstraction)与行为实现(implementation)分离开来,          从而能够保持各部分的独立性以及应对它们的功能扩展。

(2)适用状况:桥接模式是将抽象部分与实现部分分离(解耦合),使它们均可以独立的变化。

六、外观模式

(1)Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具备相似功能的类群,好比类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称做facade。

(2)适用状况:为子系统中统一一套接口,让子系统更加容易使用。

七、享元模式

(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 }
相关文章
相关标签/搜索