看板 C_and_CPP 關於我們 聯絡資訊
p.s. BBS程式碼標色工具掛了,所以只好用醜醜的手動標色了 XD 人都是八卦的,所以 1. 如果有人以一個謠言為基礎,換個人名就散佈謠言,用這種方法散佈多了,我們叫它 Prototype Pattern 典型的作法就是 PolicyRumor* prPrototype = PolicyRumor::getPrototype(); //取得原形 Rumor* r1 = (prPrototype->clone())->setName("薄熙來"); Rumor* r2 = (prPrototype->clone())->setName("李登輝"); 你看,這不就簡單地創造了兩個謠言嗎 2. 如果有人用一組預設的謠言為基礎,提供客戶很多種東西讓他可以用自己的元件客制 化謠言再散佈出去,我們稱為Builder Pattern 這種做法就是 Rumor* r3 = (SpicyRumor::createBuilder())->setName("某男星")->setTarget("某女星")->setPlace("薇閣")->create(); 你看,簡單易懂 3. 如果有個人在需要新聞的時候,找個八卦聚集地,要他們製造出一個 我需要的種類的謠言,我們稱為Factory。 (當然它本意不是這樣,只是看起來會是這樣 XD) SportRumor* r4 = static_cast<SportRumor*>(AppleDaily::getRumorGenerator(RumorType::Sport)->createRumor()); 4. 如果有人有個固定的寫手,提供一組號碼跟不同分機,讓每個人都可以打電話進去 提供線索,打不同分機提供不同謠言,我們稱為Abstract Factory Pattern UncontainedRumor* r5 = AppleDaily::createRumor(分機號碼& 分機); 老實講3跟4很像,我也常常搞混 雖然他們意思完全天差地遠 5. 如果有高層過來關切,要求我們每製造一組謠言一定要跟他們說,這種情況我們稱為 Observer pattern //也許高層會希望"監測爆料"這件事情保密,所以要用private繼承而非protect/public? class RumorFactory : protected HighLevelTelephoneNotify { Rumor createRumor(); virtual void attach(const HighLevel&); //連接高層用 virtual void notify(const SomeNotifyStructure&); //通知用 virtual void detach(const HighLevel&); //高層失勢後斷絕聯絡用(咦?) }; 6. 如果我們有固定的好幾個線民(比方說演藝圈,政治圈等等各一個線民),用這個線 民很方便地提供很多奇怪的資訊供很多不同的雜誌製造出謠言, 這種情況遊民共享的情況我們叫他做Flyweight static RumorSource& rs1 = PoliticsRumorSource::getInst(); ///通常共用的東西我們用Singleton實作 static RumorSource& rs2 = ActorRumorSource::getInst(); static RumorSource& rs3 = SportRumorSource::getInst(); 某日報出刊用這三個消息來源 public DailyNews* DailyNewsFactory::createDailyNews() { return DailyNews::createFromRumor(rs1, rs2, rs3); } 某X周刊出刊一樣用這三個消息來源 阿就createRumor實作有點差異而已 public TimeNews* TimeNewsFactory::createTimeNews() { return TimeNews::createFromRumor(rs1, rs2); } 說真的,他們這種作法,狠一點的我還可以寫個template用policy pattern表達出來 不過這離題了 XD 7. 如果我們希望能夠多聽一些謠言,提供了一組可拋棄的信箱(防止收到垃圾信)來接 收這些謠言,這稱為Delegate pattern class ISelectedNewsSource { //這個const還挺重要的,請務必維持這個好習慣 這很重要 //前面的boolean通常可以告訴source這次的update你還要不要繼續讀下去 virtual boolean onPolicyRumorFetched(const PolicyRumor&); virtual boolean onActorRumorFetched(const ActorRumor&); ... ... } class MySourceHandler : protected ISelectedNewsSource { ... ... ... } ISelectedNewsSource* source = new MySourceHandler; dailyNews.setOnPublishCallback(source); 8 最後,當我們嫌這些謠言好煩,再也不想聽到這些加油添醋的訊息了,我們就可以把 Adapter/Bridge拔掉,用自己的判斷去評論收到的訊息 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.192.252.25 Killercat:轉錄至看板 Programming 04/12 11:54
diabloevagto:看不太懂這個八卦... 04/12 12:48
Killercat:不過就是在說明一些design pattern運作原理而已 orz 04/12 13:12
angleevil:= =拍謝,我功力不夠.我也看不懂... 04/12 13:34
iWRZ:怎麼看起來像Java? 04/12 13:41
iamstudent:這篇是在講Design Pattern,用的語言是java 04/12 13:53
iamstudent:有點偏離本版討論了,dp有OOAD可以討論,java也有專版 04/12 13:54
Killercat:我是java寫多了 不過除了兩個地方少了個*以外 04/12 14:04
Killercat:這看起來應該基本上都是C++才對啊(抓頭) 04/12 14:04
Killercat:我個人因為習慣用ref來取代pointer 所以->用得比較少 04/12 14:05
Killercat:會不會是因為這原因讓你們覺得像java? 04/12 14:05
Killercat:阿我知道為什麼了,有些地方的確寫成java了 我改一下XD 04/12 14:06
Killercat:java寫多了 一些C++的東西都會不小心混進奇怪code進去 04/12 14:12
※ 編輯: Killercat 來自: 220.136.83.196 (04/12 14:35)
purpose:可以留下 JAVA / C++ 的作法,這樣符合此版,又能比對 04/12 14:42
purpose:語言切來切去,容易搞混。這篇內容比較精鍊吧,我只看懂 04/12 14:44
purpose:一點,有些前因後果原PO稍微省略了,所以囉... 04/12 14:44
Killercat:其實這篇由來是這樣的 =P 中共前陣子不是因為北京一些 04/12 14:46
Killercat:事件以謠言為理由封鎖了幾個網站,我剛好跟幾個geek的 04/12 14:46
Killercat:工程師聊到這個,又剛好聊到design pattern 04/12 14:46
Killercat:所以我就寫了這篇讓大家笑一下 XD 04/12 14:47
Killercat:基本上對看不懂paattern的可能沒什麼幫助(比方說第一個 04/12 14:47
Killercat:prototype的核心就是->clone()) 看得懂的就當工程師笑話 04/12 14:47
Killercat:看看笑笑就好了 XD 04/12 14:48
Killercat:基本上我想用過這些pattern的應該都能會心一笑 04/12 14:48
iWRZ:個人想問 pattern 純C可以寫出來嗎? 04/12 16:56
Killercat:我可以跟你說 struct mask是無敵的 只是好不好用 XD 04/12 17:14
Killercat:沒有人願意用struct mask+macro模擬出一堆繼承feature 04/12 17:15
Killercat:我們可以反過來說 有什麼事malloc+memset寫不出來的XD 04/12 17:15
angleevil:有阿,被ooc逼退的頭髮,寫不回來(認真).所以我不碰那個 04/12 17:26
EdisonX:http://ppt.cc/;Odb 04/12 17:27
fengchu:回應i大。patterns和程式語言的種類高度相關。在C裏用函式 04/12 18:55
fengchu:指標陣列也算是一種pattern。在functional PL裏的pattern 04/12 18:55
fengchu:與OOPL裏的patterns也不太一樣。 04/12 18:56
mingtai1:第一個prototype pattern感覺常常很像template pattern.. 04/12 21:30
Killercat:template比較類似填洞(像builder),prototype比較像是 04/12 22:22
Killercat:你要生出一大群只差一個兩個相異點的物件 04/12 22:22
Killercat:當然你可以有很多種prototype 然後挑一個clone... 04/12 22:23
FAITHY:好強 能知道->清楚分辨->活用 這些設計概念好厲害 ... 04/12 23:26
Killercat:其實我想說的是,Design Pattern是一種殊途同歸的結果 04/13 09:49
Killercat:就算你沒看過DP,當你很有經驗的時候,你會發現你用的 04/13 09:49
Killercat:方法會跟大多數有經驗的人一樣,剛好也跟DP一樣 04/13 09:50
Killercat:其實除了少部分非常高深的pattern(多半跟template有關, 04/13 09:50
Killercat:比方說policy pattern這真的需要點才華)以外,大多數的 04/13 09:51
Killercat:patterns(像是GOF寫的那本硬殼書)都是遲早自己會寫到的 04/13 09:52
Killercat:不過這些需要才華的多半也被冠上design之名了 04/13 09:53
tomap41017:推上面最後這段 04/13 13:50
tomap41017:原PO寫得真的很棒!推 04/13 13:50
damody:推呀!C++無誤,不過第二個的new好像沒有delete 04/14 03:46
Killercat:builder有一種做法是.create()裡面delete this; 04/14 10:48
Killercat:當然這不是一個好的寫法 因為誰new應該就要誰delete 04/14 10:48
Killercat:所以第二個應該改成::createBuilder()->...->create(); 04/14 10:49
Killercat:createBuilder()做一個new Builder()這樣 @@a 04/14 10:49
※ 編輯: Killercat 來自: 123.192.252.25 (04/14 10:52) ※ 編輯: Killercat 來自: 123.192.252.25 (04/14 10:52)
damody:推新版本不用 delete 04/20 06:55