Time of Update: 2017-02-27
作用:運用共用技術有效地支援大量細粒度的對象。UML結構圖:解析:Flyweight模式在大量使用一些可以被共用的對象的時候經常使用.比如,在QQ聊天的時候很多時候你懶得回複又不得不回複的時候,一般會用一些客套的話語敷衍別人,如"呵呵","好的"等等之類的,這些簡單的回覆其實每個人都是提前定義好的,在使用的時候才調用出來.Flyweight就是基於解決這種問題的思路而產生的,當需要一個可以在其它地方共用使用的對象的時候,先去查詢是否已經存在了同樣的對象,如
Time of Update: 2017-02-27
作用:使多個對象都有機會處理請求,從而避免請求的寄件者和接收者之間的耦合關係.將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止.UML結構圖:抽象基類:1)Handler:定義一個處理請求的介面,在圖中這個介面就是HandleRequset函數,這個類同時有一個指向Handler對象的指標,指向後續的處理請求的對象(如果有的話).解析:這個模式把可以處理一個請求的對象以鏈的形式連在了一起,讓這些對象都有處理請求的機會.好比原來看古裝電視中經常看到皇宮中召見某人的時候,太監們
Time of Update: 2017-02-27
作用:定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。TemplateMethod 使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。UML結構圖:抽象基類:1)AbstractClass:抽象基類,定義演算法的輪廓解析:TemplateMethod
Time of Update: 2017-02-27
作用:為其他對象提供一種代理以控制對這個對象的訪問。UML結構圖:抽象基類:1)Subject:定義了Proxy和RealSubject的公有介面,這樣就可以在任何需要使用到RealSubject的地方都使用Proxy.解析:Proxy其實是基於這樣一種時常使用到的技術-某個對象直到它真正被使用到的時候才被初始化,在沒有使用到的時候就暫時用Proxy作一個預留位置.這個模式實現的要點就是Proxy和RealSubject都繼承自Subject,這樣保證了兩個的介面都是一致的.實現:1)Proxy
Time of Update: 2017-02-27
作用:將對象組合成樹形結構以表示“部分-整體”的階層。Composite使得使用者對單個對象和組合對象的使用具有一致性。UML結構圖:抽象基類:1)Component:為組合中的對象聲明介面,聲明了類共有介面的預設行為(如這裡的Add,Remove,GetChild函數),聲明一個介面函數可以訪問Component的子組件.介面函數:1)Component::Operatation:定義了各個組件共有的行為介面,由各個組件的具體實現.2)Component::Add添加一
Time of Update: 2017-02-27
作用:將抽象部分與它的實現部分分離,使它們都可以獨立地變化。UML結構圖:抽象基類:1)Abstraction:某個抽象類別,它的實現方式由Implementor完成.2)Implementor:實作類別的抽象基類,定義了實現Abastraction的基本操作,而它的衍生類別實現這些介面.介面函數:1)Implementor::OperationImpl:定義了為實現Abstraction需要的基本操作,由Implementor的衍生類別實現之,而在Abstraction::Operation函
Time of Update: 2017-02-27
作用:將一個類的介面轉換成客戶希望的另外一個介面。Adapt 模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。UML示意圖1)採用繼承原有介面類的方式2)採用組合原有介面類的方式解析:Adapt模式其實就是把完成同樣的一個功能但是介面不能相容的類橋接在一起使之可以在一起工作,這個模式使得複用舊的介面成為可能.
Time of Update: 2017-02-27
作用:保證一個類僅有一個執行個體,並提供一個訪問它的全域訪問點。UML結構圖:解析:Singleton模式其實是對全域靜態變數的一個取代策略,上面提到的Singleton模式的兩個作用在C++中是通過如下的機制實現的:1)僅有一個執行個體,提供一個類的靜態成員變數,大家知道類的靜態成員變數對於一個類的所有對象而言是惟一的 2)提供一個訪問它的全域訪問點,也就是提供對應的訪問這個靜態成員變數的靜態成員函數,對類的所有對象而言也是惟一的.在C++中,可以直接使用類域進行訪問而不必初始化一個類的對象.
Time of Update: 2017-02-27
作用:用原型執行個體指定建立對象的種類,並且通過拷貝這些原型建立新的對象。UML結構圖:抽象基類:1)Prototype:虛擬基類,所有原型的基類,提供Clone介面函數介面函數:1)Prototype::Clone函數:純虛函數,根據不同的衍生類別來執行個體化建立對象.解析:Prototype模式其實就是常說的"虛擬建構函式"一個實現,C++的實現機制中並沒有支援這個特性,但是通過不同衍生類別實現的Clone介面函數可以完成與"虛擬建構函式"同樣的效果.
Time of Update: 2017-02-27
作用:將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。UML結構圖:適用於以下情況:1)當建立複雜物件的演算法應該獨立於該對象的組成部分以及它們的裝配方式時。2)當構造過程必須允許被構造的對象有不同的表示時。抽象基類:1)Builder:這個基類是全部建立對象過程的抽象,提供構建不同組成部分的介面函數介面:1)Builder::BuildPartA,Builder::BuildPartB:是對一個對象不同部分的構建函數介面,Builder的衍生類別來具體實現.另外還有一
Time of Update: 2017-02-27
作用:提供一個建立一系列相關或相互依賴對象的介面,而無需指定它們具體的類。UML結構圖:抽象基類:1)ProductA,ProductB:分別代表不同類型的產品,而它們的衍生類別則是這種產品的一個實現.2)AbstractFactory:生產這一系列產品的一個抽象工廠,它的衍生類別是不同的實現.介面函數:1)AbstractFactory::CreateProductA和AbstractFactory::CreateProductB:分別是生產不同產品的不同的實現,由各個派生出來的抽象工廠實現之
Time of Update: 2017-02-27
作用:定義一個用於建立對象的介面,讓子類決定執行個體化哪一個類。Factory Method 使一個類的執行個體化延遲到其子類。UML結構圖:抽象基類:1)Product:建立出來的對象的抽象基類.2)Factory建立對象的Factory
Time of Update: 2017-02-27
由於沒有類似java的“反射”機制,標準C++下實現RMI似乎有些困難。為C++程式員所熟悉的Boost庫雖然有RCF實現了類似RMI的功能,但RCF本身需依賴於Boost::serlization支援,而serlization需要編譯之後方可使用,且有諸多限制。本文試圖通過C++特有的代碼複用機制類比實現具有類似RMI功能的類庫,雖然不能完全實現java的RMI功能,但較之以往的C/S編程模式有了很大改觀,且文中涉及很多C++代碼複用技術例如模板,純虛函數,方法對象等,
Time of Update: 2017-02-27
目錄基本原理拋棄託管擴充未來的樂趣編程的演變終極目標結束語,儘管不是再見這個月,我要改變常規的問答形式來告訴您關於我在網上發現的一個非常不錯的文檔。幾個星期前,有人寫信詢問我,為什麼他不能在 C++/CLI 中聲明 const 函數:// 引用類ref class A { void f() const; // 不!};對此,我回複道:您就是不能,這是規則。通用語言基礎結構 (CLI) 是為支援諸如 Visual Basic®、Java 甚至是 COBOL 語言而設計的 -
Time of Update: 2017-02-27
經過前面的學習,大家應該能夠根據例子用ANSI C為自己的伺服器寫出CGI程式。之所以選用ANSI C,是因為它幾乎隨處可見,是最流行的C語言標準。當然,現在的C++也非常流行了,特別是採用GNU C++編譯器(g++)形式的那一些(注釋④)。可從網上許多地方免費下載g++,而且可選用幾乎所有平台的版本(通常與Linux那樣的作業系統配套提供,且已預先安裝好)。正如大家即將看到的那樣,從CGI程式可獲得物件導向程式設計的許多好處。④:GNU的全稱是“Gnu's Not
Time of Update: 2017-02-27
最近看到一個問題,如何用Java實現從控制台輸入密碼?本來以為是很簡單的問題,查了一下發現Java居然沒提供這樣一個方法。目前實現的方式有2個,一個是利用JNI來調用C/C++方法,另一個是使用多線程。下面是使用JNI的方法:首先,寫出我們的Java類:public class JNIPasswordReader {private native String readPassword();static {System.loadLibrary( " PasswordDLL "
Time of Update: 2017-02-27
“作為一名C++程式員,我們早已掌握了物件導向程式設計的基本概念,而且Java的文法無疑是非常熟悉的。事實上,Java本來就是從C++衍生出來的。”然而,C++和Java之間仍存在一些顯著的差異。可以這樣說,這些差異代表著技術的極大進步。一旦我們弄清楚了這些差異,就會理解為什麼說Java是一種優秀的程式設計語言。本附錄將引導大家認識用於區分Java和C++的一些重要特徵。(1)
Time of Update: 2017-02-27
這篇文章我想複習下C#中的基元類型。雖然搞清楚基元類型的知識並不會是你工作的必要條件,但做為一個搞技術的人來說還是非常有必要的。起碼可以對付有些顯得比較BT的面試題,哈哈!關於什麼是基元類型,我想並不是每一位開發人員都清楚的,有部分的朋友只知道怎麼在工作中應用它(例如int,string)。如果一個編程基礎比較紮實的朋友來說當然不在話下,就不說別人,拿我自己來說,編程三年多,我都不太關心什麼是基元類型,它有什麼用,其實不知道這些對工作也不會產生決定性的影響。如果你不知道基底類型的概念,但會用in
Time of Update: 2017-02-27
自從米格的仁兄向我推薦C#之後,偶就誤入歧途的漸漸脫離了Java陣營。最近在寫工具的時候,忽然發現了一個老生常談的閃爍問題,要知道這樣的問題在Java
Time of Update: 2017-02-27
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]public struct Data{public int MessageID;public double price;public long number;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]public string str;//public char[] str;/