[分享] 人都是八卦的,所以...
※ [本文轉錄自 C_and_CPP 看板 #1FXSckDL ]
作者: Killercat (殺人貓™) 看板: C_and_CPP
標題: [分享] 人都是八卦的,所以...
時間: Thu Apr 12 02:13:00 2012
p.s. BBS程式碼標色工具掛了,所以只好用醜醜的手動標色了 XD
人都是八卦的,所以
1. 如果有人以一個謠言為基礎,換個人名就散佈謠言,用這種方法散佈多了,我們叫它
Prototype Pattern
典型的作法就是
Rumor r1 = (PoliticsRumor.clone()).setName("薄熙來");
Rumor r2 = (PoliticsRumor.clone()).setName("李登輝");
你看,這不就簡單地創造了兩個謠言嗎
2. 如果有人用一組預設的謠言為基礎,提供客戶很多種東西讓他可以用自己的元件客制
化謠言再散佈出去,我們稱為Builder Pattern
這種做法就是
Rumor r3 = (new SpicyRumor.Builder()).setName("某男星").setTarget("某女星").setPlace("薇閣").create();
你看,簡單易懂
3. 如果有個人在需要新聞的時候,找個八卦聚集地,要他們製造出一個
我需要的種類的謠言,我們稱為Factory。
(當然它本意不是這樣,只是看起來會是這樣 XD)
SportRumor r4 = (SportRumor) SystemManager.getRumorGenerator(Rumor.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(); //連接高層用
virtual void notify(SomeNotifyStructure&); //通知用
virtual void detach(); //高層失勢後斷絕聯絡用(咦?)
};
6. 如果我們有固定的好幾個線民(比方說演藝圈,政治圈等等各一個線民),用這個線
民很方便地提供很多奇怪的資訊供很多不同的雜誌製造出謠言,
這種情況遊民共享的情況我們叫他做Flyweight
static RumorSource rs1 = PoliticsRumorSource.getInst();
///通常共用的東西我們用Singleton實作
static RumorSource rs2 = ActorRumorSource.getInst();
static RumorSource rs3 = SportRumorSource.getInst();
某日報出刊用這三個消息來源
public DailyNews DailyNewsFactory::createDailyNews() {
return DailyNews::createRumor(rs1, rs2, rs3);
}
某X周刊出刊一樣用這三個消息來源 阿就createRumor實作有點差異而已
public TimeNews TimeNewsFactory::createTimeNews() {
return TimeNews::createRumor(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
※ 發信站: 批踢踢實業坊(ptt.cc)
※ 轉錄者: Killercat (220.136.83.196), 時間: 04/12/2012 11:54:16
推
05/14 04:08, , 1F
05/14 04:08, 1F