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 }
相關文章
相關標籤/搜索