1. 程式人生 > 實用技巧 >C++ 結構型模式

C++ 結構型模式

結構型模式包括:

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 }