[分享] 人都是八卦的,所以...

看板C_and_CPP作者 (殺人貓™)時間13年前 (2012/04/12 02:13), 編輯推噓10(10042)
留言52則, 12人參與, 最新討論串1/1
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

04/12 12:48, , 1F
看不太懂這個八卦...
04/12 12:48, 1F

04/12 13:12, , 2F
不過就是在說明一些design pattern運作原理而已 orz
04/12 13:12, 2F

04/12 13:34, , 3F
= =拍謝,我功力不夠.我也看不懂...
04/12 13:34, 3F

04/12 13:41, , 4F
怎麼看起來像Java?
04/12 13:41, 4F

04/12 13:53, , 5F
這篇是在講Design Pattern,用的語言是java
04/12 13:53, 5F

04/12 13:54, , 6F
有點偏離本版討論了,dp有OOAD可以討論,java也有專版
04/12 13:54, 6F

04/12 14:04, , 7F
我是java寫多了 不過除了兩個地方少了個*以外
04/12 14:04, 7F

04/12 14:04, , 8F
這看起來應該基本上都是C++才對啊(抓頭)
04/12 14:04, 8F

04/12 14:05, , 9F
我個人因為習慣用ref來取代pointer 所以->用得比較少
04/12 14:05, 9F

04/12 14:05, , 10F
會不會是因為這原因讓你們覺得像java?
04/12 14:05, 10F

04/12 14:06, , 11F
阿我知道為什麼了,有些地方的確寫成java了 我改一下XD
04/12 14:06, 11F

04/12 14:12, , 12F
java寫多了 一些C++的東西都會不小心混進奇怪code進去
04/12 14:12, 12F
※ 編輯: Killercat 來自: 220.136.83.196 (04/12 14:35)

04/12 14:42, , 13F
可以留下 JAVA / C++ 的作法,這樣符合此版,又能比對
04/12 14:42, 13F

04/12 14:44, , 14F
語言切來切去,容易搞混。這篇內容比較精鍊吧,我只看懂
04/12 14:44, 14F

04/12 14:44, , 15F
一點,有些前因後果原PO稍微省略了,所以囉...
04/12 14:44, 15F

04/12 14:46, , 16F
其實這篇由來是這樣的 =P 中共前陣子不是因為北京一些
04/12 14:46, 16F

04/12 14:46, , 17F
事件以謠言為理由封鎖了幾個網站,我剛好跟幾個geek的
04/12 14:46, 17F

04/12 14:46, , 18F
工程師聊到這個,又剛好聊到design pattern
04/12 14:46, 18F

04/12 14:47, , 19F
所以我就寫了這篇讓大家笑一下 XD
04/12 14:47, 19F

04/12 14:47, , 20F
基本上對看不懂paattern的可能沒什麼幫助(比方說第一個
04/12 14:47, 20F

04/12 14:47, , 21F
prototype的核心就是->clone()) 看得懂的就當工程師笑話
04/12 14:47, 21F

04/12 14:48, , 22F
看看笑笑就好了 XD
04/12 14:48, 22F

04/12 14:48, , 23F
基本上我想用過這些pattern的應該都能會心一笑
04/12 14:48, 23F

04/12 16:56, , 24F
個人想問 pattern 純C可以寫出來嗎?
04/12 16:56, 24F

04/12 17:14, , 25F
我可以跟你說 struct mask是無敵的 只是好不好用 XD
04/12 17:14, 25F

04/12 17:15, , 26F
沒有人願意用struct mask+macro模擬出一堆繼承feature
04/12 17:15, 26F

04/12 17:15, , 27F
我們可以反過來說 有什麼事malloc+memset寫不出來的XD
04/12 17:15, 27F

04/12 17:26, , 28F
有阿,被ooc逼退的頭髮,寫不回來(認真).所以我不碰那個
04/12 17:26, 28F

04/12 17:27, , 29F
04/12 17:27, 29F

04/12 18:55, , 30F
回應i大。patterns和程式語言的種類高度相關。在C裏用函式
04/12 18:55, 30F

04/12 18:55, , 31F
指標陣列也算是一種pattern。在functional PL裏的pattern
04/12 18:55, 31F

04/12 18:56, , 32F
與OOPL裏的patterns也不太一樣。
04/12 18:56, 32F

04/12 21:30, , 33F
第一個prototype pattern感覺常常很像template pattern..
04/12 21:30, 33F

04/12 22:22, , 34F
template比較類似填洞(像builder),prototype比較像是
04/12 22:22, 34F

04/12 22:22, , 35F
你要生出一大群只差一個兩個相異點的物件
04/12 22:22, 35F

04/12 22:23, , 36F
當然你可以有很多種prototype 然後挑一個clone...
04/12 22:23, 36F

04/12 23:26, , 37F
好強 能知道->清楚分辨->活用 這些設計概念好厲害 ...
04/12 23:26, 37F

04/13 09:49, , 38F
其實我想說的是,Design Pattern是一種殊途同歸的結果
04/13 09:49, 38F

04/13 09:49, , 39F
就算你沒看過DP,當你很有經驗的時候,你會發現你用的
04/13 09:49, 39F

04/13 09:50, , 40F
方法會跟大多數有經驗的人一樣,剛好也跟DP一樣
04/13 09:50, 40F

04/13 09:50, , 41F
其實除了少部分非常高深的pattern(多半跟template有關,
04/13 09:50, 41F

04/13 09:51, , 42F
比方說policy pattern這真的需要點才華)以外,大多數的
04/13 09:51, 42F

04/13 09:52, , 43F
patterns(像是GOF寫的那本硬殼書)都是遲早自己會寫到的
04/13 09:52, 43F

04/13 09:53, , 44F
不過這些需要才華的多半也被冠上design之名了
04/13 09:53, 44F

04/13 13:50, , 45F
推上面最後這段
04/13 13:50, 45F

04/13 13:50, , 46F
原PO寫得真的很棒!推
04/13 13:50, 46F

04/14 03:46, , 47F
推呀!C++無誤,不過第二個的new好像沒有delete
04/14 03:46, 47F

04/14 10:48, , 48F
builder有一種做法是.create()裡面delete this;
04/14 10:48, 48F

04/14 10:48, , 49F
當然這不是一個好的寫法 因為誰new應該就要誰delete
04/14 10:48, 49F

04/14 10:49, , 50F
所以第二個應該改成::createBuilder()->...->create();
04/14 10:49, 50F

04/14 10:49, , 51F
createBuilder()做一個new Builder()這樣 @@a
04/14 10:49, 51F
※ 編輯: Killercat 來自: 123.192.252.25 (04/14 10:52) ※ 編輯: Killercat 來自: 123.192.252.25 (04/14 10:52)

04/20 06:55, , 52F
推新版本不用 delete
04/20 06:55, 52F
文章代碼(AID): #1FXSckDL (C_and_CPP)