標籤:日誌 設計模式 boost
今天白天主要看了boost庫的應用,主要是常用的一些庫,array,bind,function,regex,thread,unordered,ref,smartpointers庫,晚上看了看設計模式,主要就是面板模式,建造者模式和觀察者模式。我們從boost簡要說起。
其實boost的庫好多東西在c++11裡面已經有了,比如bind,只不過boost的庫的bind比c++11用著感覺要方便,其實有些東西我自己因為也沒有用c++做過什麼大的項目,所以不敢亂說,只敢說點建議性的,關於bind就是綁定函數吧,這個。。。比如一個函數原型是這樣void fun(int a,int b),我們就可以用boost再綁定一下,比如第2個參數我們固定為100,那麼就可以這麼寫boost::function<void(int,int)> fun1 = boost::bind(fun,_1,100),這樣我們就成功的通過function和bind聯合起來用,來綁定了,我們這裡說的是一個定值,其實這裡完全可以根據業務需求來換成一個不定的值。
接下來說說regex,這個是今天最頭疼的問題,不是因為Regex難,Regex在以前我做java的時候用過,感覺還不錯啊,但是boost,c++的文法今天實在是令我淡疼,所以我就想,就先這麼膚淺的用著吧,有項目要用的時候我們在深入一下也不遲,boost::regex_match這個函數主要是全部匹配匹配整個串,boost::regex_search這個函數可以實現匹配部分哦,比如192.168.0.1,我們可以通過"(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)",來匹配出數字啊,結果自然就存在boost::smatch裡面啦,還有一個boost::regex_replace,這個替換完的會通過返回值返回回來的。
還有thread,其實c++11就是抄的boost的thread,他倆大同小異,大家可以藉助文檔啦。
還有智能指標,智能指標大體有3種,scoped,shared,weak,細分的話就是scoped_ptr,scoped_array,同理shared也是,weak只有weak_ptr,scoped的意思就是我們分配了就只能是我自己指向這塊記憶體,不能拷貝賦值,shared可以拷貝賦值。weak_ptr是一個弱引用,為什麼說是弱引用呢,其實並不修改該對象的引用計數。
若引用可以防止記憶體泄露,不要認為只能指標就不會記憶體泄露,c++的記憶體泄露也是偶爾會存在智能指標裡的,舉個栗子:
#include <iostream>#include <boost/smart_ptr.hpp>using namespace std;class Parent;class Children;class Parent{public:Parent(){cout << "parent create" << endl;}~Parent(){cout << "parent destroy" << endl;}boost::shared_ptr<Children> c;};class Children{public:Children(){cout << "children create" << endl;}~Children(){cout << "children destroy" << endl;}boost::shared_ptr<Parent> p;};void test(){boost::shared_ptr<Parent> p(new Parent);boost::shared_ptr<Children> c(new Children);p->c = c;c->p = p;}void main(){test();cin.get();}
這不就記憶體泄露了嗎,Parent裡有指標指向Children,Children內部有指標指向Parent,這倆就在這迴圈著,誰也不釋放記憶體,如果想結局這個問題,我們就要用到weak_ptr,只要我們將其中一個對象內部的指標從shared_ptr改為weak_ptr就可以了,所以說我們編程的時候,一定要有這個意識,智能指標也會記憶體泄露。
ref就是一個封裝的引用,有的時候我們不能拷貝複製,因為有的時候傳參是拷貝傳參的,所以這個時候我們就要用到了ref。
unordered裡主要是由unordered_map,unordered_mutlimap,unordered_set,unordered_mutliset,他們內部結構都是雜湊,尋找的時間複雜度為O(1),這個是boost幫我們實現的了。
-----------------------------------------------------------------------------------------------------------分割線-------------------------------------------------------------------------------------------------------------------
下面是設計模式了
面板模式::
這個面板模式的精髓就在於Facade這個類實現的分離。
面板模式就是給用戶端暴露的介面很少,真正複雜的商務邏輯我們全都繳費Facade和SubSystem來互動。
應用情境:
首先,在設計初期階段,應該要有意識將不同的兩個層分離,,層與層之間建立外觀Facade,
其次,在開發階段,子系統往往因為不斷的重構演化而變得越來越複雜。增加面板模式,減少依賴。
第三,維護一個一流的大型系統的時候,可能這個系統已經非常難以維護和擴充了,就要修改設計,讓新系統與Facade對象互動,Facade與遺留代碼互動所有複雜工作。
MVC不就是採用的這個模式嗎.分層思想。。。
建造者模式:;
這個建造者模式的精髓主要用於建立一些複雜的最想,這些對象內部構建間的建造順序通常是穩定的,但對象內部的構建通常面臨著複雜的變化。
這個內部很複雜,但是這些東西都是Director來做的,Client不用管,Client管的就是按照介面一個一個的把方法實現就行了,然後用Director來建立對象,最後產品就出來了。
好處:使建造代碼與表示代碼分離,由於建造者隱藏了該產品是如何組裝的,所以如果需要改變一個產品的內部表示,只需要再定義一個具體的建造者就可以了。
所以說,建造者模式是在當建立複雜物件的演算法應該獨立於該對象的組成部分以及他們的裝配方式時使用的模式.
其實我們在android裡的AlertDialog.Builder不也很相似嗎,我們沒有關注細節,最後build除了那個dialog
觀察者模式::
今天晚上用c++調了半天,最後還是有點小問題,明天再調吧,今天實在是困得不行不行了。
我們說完,觀察者模式就是我們常說的監聽,其實監聽器就是根據這個模式來的。當一個對象的改變需要同時改變其他對象的時候就需要我們考慮用觀察者模式了,
而且他不知道具體有多少對象有待改變的時候,應該考慮使用觀察者模式。
觀察者模式所做的工作就是在解除耦合.讓耦合雙方都依賴於抽象,而不是依賴於具體,從而使得各自的變化都不會影響另一邊的變化.
實在是困了,這了快2點了,明天正常的話要7點多起床,看來要8點起床了,已經刷完牙啦,準備睡覺,各位看官都這個點了,早點睡吧,我去睡覺了,晚安~
2015-03-12---面板模式,建造者模式,觀察者模式,boost庫應用